2011-06-03 15 views
7

Lo siento por no hacer mi propia investigación y preguntarla aquí. Estoy un poco corto de tiempo.Hilos y descriptores de archivos

Es posible tener dos tablas de descriptores de archivos para dos o más subprocesos derivados de un único subproceso. Los dos o más subprocesos secundarios están accediendo concurrentemente al mismo archivo, entonces ¿el desplazamiento para dos aperturas diferentes para el mismo archivo de diferentes subprocesos, es específico del subproceso?

Gracias

Respuesta

3

Los descriptores de archivo se comparten entre los subprocesos. Si desea desplazamientos "específicos de subprocesos", ¿por qué no hacer que cada subproceso use un descriptor de archivo diferente (open(2) varias veces)?

+0

¿Qué tal 'dup()' en su lugar? – trojanfoe

+1

@trojanfoe No, 'dup' y' dup2' no funcionarán (quiere compensaciones "específicas de hilo"). – cnicutar

+0

dup() solo duplica el descriptor de archivo y no la estructura del kernel que representa un archivo abierto –

10

No, sólo hay tabla de descriptores de un archivo por cada proceso, y es compartida entre todos los hilos.

Desde la descripción del problema, es posible que desee examinar las funciones pread() y pwrite().

+0

+1 para incluir no solo la respuesta sino la solución, 'pread' y' pwrite'. –

0

En Linux, puede unshare() la tabla de descriptores de archivos a través de la bandera CLONE_FILES, pero le desaconsejaría.

+0

Tenga en cuenta que esto no ayudará con el problema de "desplazamientos compartidos". Incluso si dos subprocesos ya no comparten su tabla fd (e incluso si son procesos separados con tablas fd separadas para empezar), dos descriptores de archivo que hacen referencia a la misma "descripción de archivo abierto" siempre comparten desplazamientos. –

0

Pruebe pread()/pwrite().

Todavía puede compartir el mismo descriptor de archivo entre varios subprocesos, es decir, se garantiza que las lecturas y escrituras paralelas en el mismo archivo serán atómicas usando pread()/pwrite() ya que necesitará especificar desplazamiento y número de bytes para leer/escribir respectivamente.

Cuestiones relacionadas