2012-07-04 11 views
6

Unix núcleo representa los archivos abiertos utilizando tres estructuras de datos: Descriptor table, File table, y v-node table.
Cuando un proceso abre un archivo dos veces, obtiene dos descriptores diferentes en el descriptor table, dos entradas en el file table (para que tengan diferentes posiciones en el mismo archivo), y ambos apuntan a una entrada en el v-node table.
Y el proceso hijo hereda el proceso principal descriptor table, por lo que kernel mantiene un descriptor table para cada proceso, respectivamente. Pero dos descriptores de procesos diferentes apuntan a la misma entrada en open file table.
Así
descriptor de archivo desde distintos puntos de proceso a la misma entrada en la tabla de archivos abiertos

  1. Cuando el proceso hijo hace algunos leen en el archivo, sería el desplazamiento del mismo cambio en el archivo de proceso padre?
  2. Si 1 es verdadero, para dos procesos, ¿existe una manera conveniente de obtener el mismo efecto de fork en el mismo archivo? Eso significa que dos procesos comparten una información de posición (desplazamiento) en el mismo archivo.
  3. Hay una forma de bifurcar para que ambos procesos tengan tablas totalmente no relacionadas, como dos procesos no relacionados solo que abren los mismos archivos.

Respuesta

8

Al proceso hijo hace algo de leer en el archivo, sería el desplazamiento del mismo cambio en el archivo de proceso padre?

Sí, dado que el desplazamiento se almacena en la tabla de archivos de todo el sistema. Puede obtener un efecto similar usando dup o dup2.

Si 1 es verdadero, para dos procesos, ¿existe una forma conveniente de obtener el mismo efecto de fork en el mismo archivo? Eso significa que dos procesos comparten una información de posición (desplazamiento) en el mismo archivo.

Hay una técnica llamada "pasar el descriptor de archivo" utilizando sockets de dominio Unix. Busque los datos "auxiliares" en sendmsg.

Hay una manera de bifurcar para que ambos procesos tengan tablas totalmente no relacionadas, como dos procesos no relacionados solo que abrieron los mismos archivos.

Tiene que volver a open el archivo para lograrlo. Aunque no hace lo que desea, también debe buscar la bandera FD_CLOEXEC.

Cuestiones relacionadas