2011-03-12 17 views
11

Usando las llamadas a posix read() write() linux, se garantiza que si escribo a través de un descriptor de archivo y leo otro descriptor de archivo, de manera serial, las dos acciones son mutuamente exclusivo el uno del otro ... ¿que mi descriptor de archivo leído siempre verá lo que fue escrito en último lugar por el descriptor de archivo de escritura?dos descriptores de archivo en el mismo archivo

creo que este es el caso, pero yo quiero estar seguro y la página del manual no es muy útil en esta

Respuesta

17

Depende de dónde haya obtenido los dos descriptores de archivo. Si provienen de una llamada dup (2), comparten el desplazamiento y el estado del archivo, por lo que escribir (2) en uno afectará la posición en el otro. Si, por otro lado, provienen de dos llamadas abiertas (2) separadas, cada una tendrá su propio desplazamiento y estado de archivo.

Un descriptor de archivo es más que nada una referencia a una estructura de archivos del kernel, y es la estructura del kernel que contiene la mayor parte del estado. Cuando abre (2) un archivo, obtiene una nueva estructura de archivo de kernel y un nuevo descriptor de archivo que hace referencia a ella. Cuando duplica (2) un descriptor de archivo (o pasa un descriptor de archivo a través de sendmsg), obtiene una nueva referencia a la misma estructura de archivo de kernel.

+0

¿Qué sucede si utilizo llamadas open() separadas en cada una de ellas individualmente ... ¿estarán los datos de la fd escrita disponibles para la lectura fd? –

+2

Con dos llamadas abiertas separadas, cada fd tendrá su propia posición. Entonces, si ambos están al principio del archivo y usted escribe con uno, el otro seguirá estando al principio del archivo, de modo que una escritura sobrescribirá lo que escribió la primera escritura, a menos que haya abierto el archivo con O_APPEND (en qué caso cada escritura busca implícitamente hasta el final antes de escribir). –

+4

gracias chris. mi pregunta era un poco diferente, pero sí ... si esa segunda persona estaba leyendo, leería exactamente lo que escribió la primera. La respuesta a mi pregunta es que sí, está garantizado que cualquier persona que lea el archivo después de que la escritura haya regresado leerá lo que sea que haya escrito. esto se debe a que Linux bloquea el acceso a las páginas de caché de io en la memoria –

1

Esto está garantizado si ambos se refieren a la misma descripción del archivo, también conocido como la que los obtuvo "dup" o "dup2" (o heredado a través de fork()).

Después de un exitoso regreso de uno de estas llamadas al sistema, los descriptores antiguo y nuevo archivos pueden usarse indistintamente . Se refieren a la misma descripción de archivo abierto (vea open (2)) y así comparten el desplazamiento de archivos y los indicadores de estado de archivos; por ejemplo, si el desplazamiento del archivo se modifica utilizando lseek (2) en uno de los descriptores, el desplazamiento también se cambia para el otro.

0

cuando se utiliza dup() o dup2() o fork(), la tabla de archivos es compartido por ambos de los descriptores de fichero. así que si write algo de un descriptor de archivo, y de nuevo write algo a través de otro descriptor de archivo, entonces se anexa no sobrescrito.

pero si dos procesos independientes abren un archivo, los datos escritos por ambos procesos pueden mezclarse.

Cuestiones relacionadas