Cómo afectan las condiciones de carrera las lecturas y escrituras (que ocurren al mismo time)

Digamos que abro un file para leer. ¿Qué aWriter si una aplicación, llamémosle aWriter escribe en este file en intervalos aleatorios? ¿Hay alguna posibilidad de que reciba contenido de file incorrecto si bash abrir una lectura y, al mismo time, escribir una nueva línea? ¿Qué sucede con el file y qué pasa con lo que obtengo de mi lectura?

Otro escenario Digamos que tengo un file b que contiene 100 líneas de text. También tengo una aplicación bWriter que escribe en b en momentos aleatorios. Quiero eliminar las primeras 80 líneas del file b . Supongamos que bWriter quiere escribir en b porque lo tengo abierto, ¿podrá escribir? ¿Se rendirá y perderá es escribir?

Lo pregunto porque estoy escribiendo un script de Perl que se relaciona con Syslog. Apunté a Syslog para que escriba todos los loggings en un file y mi script necesita (cada 5 minutos) leer el contenido del file, hacer otras cosas, luego eliminar todas las líneas de ese file y escribir las líneas anteriores en un file . Estoy usando el file como un paso intermedio entre mi script y el lugar de descanso final para los loggings.

¿Alguien puede darme una idea de cómo funciona esto exactamente?

Dos processs pueden tener el mismo identificador de file abierto para escritura. Al igual que con cualquier cosa, la última ejecución gana.

Cuando un process abre un identificador de file, entonces otro process escribe 80 líneas en él, el primer buffer de memory del process no tendrá esas 80 líneas. Si escribe el búfer en el manejador de files, el contenido del file será solo lo que estaba en el segundo búfer de memory.

Ahora, dicho esto, muchos progtwigs detectarán en estos días que el contenido del file original cambió desde la última vez que se abrió. Algunos se rehusarán a escribir, algunos te pedirán que recargues el buffer. Algunos pueden hacer otra cosa. Depende de cada progtwig asegurarse de que haga lo correcto. Al kernel / filesystem no le importa, y por lo que sabemos, el buffer de memory que carece de 80 líneas es la copy correcta .

Ahora, si es algo significativamente más importante como, por ejemplo, una database, en lugar de solo un file de text o documento en su directory de inicio, es mucho más probable que se use el locking de files (lo que tampoco quiere decir que vim o gedit don ' usar lockings). Una database probablemente tendrá su propio mecanismo de locking interno también.

La filosofía general de las plataforms de estilo UNIX es ser cooperativo con respecto a las escrituras de event handling files. El locking no es un mecanismo de control de security (para eso están los permissions / ACL), es un mecanismo de integridad de datos. Dos progtwigs que desean escribir datos normalmente quieren asegurarse de que los datos estén escritos correctamente, por lo que se benefician de respetar los lockings de los demás. El núcleo / sistema de files advertirá sobre lockings, pero aún permite que cada process haga lo que cree que es mejor. Sin embargo, Linux admite la ejecución obligatoria de lockings como una opción de assembly (esto también puede requerir soporte de sistema de files, pero no estoy seguro de eso).

Puede leer más información sobre lockings en el artículo File Locking de Wikipedia.