2009-04-22 20 views
5

Si uno de mis procesos abre un archivo, digamos solo para lectura, ¿el sistema operativo garantiza que ningún otro proceso escribirá sobre él mientras estoy leyendo, tal vez dejando el proceso de lectura con la primera parte de la versión de archivo anterior y la segunda parte de la versión de archivo más nueva, lo que hace cuestionable la integridad de los datos?archivos en procesos múltiples

No estoy hablando de tuberías que no tienen ninguna búsqueda, pero en archivos regulares, con la opción de búsqueda (al menos cuando se abre con un solo proceso).

Respuesta

3

No, otros procesos pueden cambiar el contenido del archivo como lo está leyendo. Intente ejecutar "man fcntl" y ignore la sección de bloqueos "asesores"; esos son bloqueos "opcionales" a los que solo tienen que prestar atención los procesos si así lo desean. En su lugar, busque los bloqueos "obligatorios" (alas, no POSIX). Aquellos son los que lo protegerán de otros programas. Pruebe un bloqueo de lectura.

+0

Los bloqueos obligatorios no son una característica deseable, en mi opinión :) – MarkR

+0

¡De acuerdo! Un mejor diseño de la aplicación sería preferible. Pero, si tiene que proteger un archivo contra lectores a los que no puede controlar, solo ellos son el camino a seguir. –

2

No, si abre un archivo, otros procesos pueden escribir en él, a menos que use un candado.

En Linux, se puede añadir una cerradura de asesoramiento en un archivo con:

#include <sys/file.h> 

... 

flock(file_descriptor,LOCK_EX); // apply an advisory exclusive lock 
+2

Los bloqueos de consulta no son útiles a menos que la aplicación de escritura también acepte usarlos. –

+0

Los bloqueos de asesoría son suficientes si se le asegura que cada parte involucrada los está siguiendo. Además, tenga en cuenta posibles problemas de interbloqueo si un proceso se bloquea mientras espera que se libere un bloqueo. – jiggy

+2

Los bloqueos obligatorios no siempre son posibles. Por ejemplo, puede que tenga que ejecutar mount con "-o mand" y cambiar algunos indicadores en el archivo. – Zifre

2

Cualquier proceso que pueda abrir el archivo para escribir, puede escribir en él. Las escrituras pueden suceder al mismo tiempo que sus propias escrituras, lo que resulta en estados (potencialmente) indeterminados.

Es su responsabilidad como escritor de la aplicación asegurarse de que las cosas malas no sucedan. En mi opinión, el bloqueo obligatorio no es una buena idea.

Una mejor idea es no otorgar acceso de escritura a los procesos que no desea escribir en el archivo.

Si varios procesos abren un archivo, tendrán punteros de archivo independientes, por lo que pueden buscar() y no afectarse entre sí.

Si un programa roscado abre un archivo (o una tarea que comparte sus descriptores de archivos con otro, más generalmente), también se comparte el puntero del archivo, por lo que debe usar otro método para acceder al archivo condiciones que causan caos, normalmente pread, pwrite, o las funciones scatter/gather readv y writev.

Cuestiones relacionadas