Utilizando el servicio IO C estándar introduce un nuevo nivel de complejidad; el archivo se modifica únicamente a través de write(2)
-familia de llamadas al sistema (o asignaciones de memoria, pero eso no se usa en este caso) - los contenedores IO estándar C pueden posponer la escritura en el archivo por un tiempo y no pueden enviar solicitudes completas en un sistema llamada.
La llamada write(2)
sí debe comportarse así:
[...] If the file was
open(2)ed with O_APPEND, the file offset is first set to the
end of the file before writing. The adjustment of the file
offset and the write operation are performed as an atomic
step.
POSIX requires that a read(2) which can be proved to occur
after a write() has returned returns the new data. Note that
not all file systems are POSIX conforming.
lo tanto sus subyacentes write(2)
llamadas se comportará correctamente.
Para las transmisiones de IO estándar C de nivel superior, también deberá ocuparse del almacenamiento en búfer. La función setvbuf(3)
se puede usar para solicitar salida sin búfer, salida con búfer de línea o salida con búfer de bloque. El comportamiento predeterminado cambia de secuencia a secuencia: si la salida estándar y el error estándar se escriben en el terminal, entonces están almacenados en búfer de línea y sin búfer por defecto. De lo contrario, el almacenamiento en bloque es el predeterminado.
Es posible que desee seleccionar manualmente el buffer de línea si sus datos están orientados de forma natural a la línea, para evitar la intercalación de datos.Si sus datos son no orientados a la línea, es posible que desee utilizarlos sin búfer o dejarlos en búfer en bloques, pero lave manualmente los datos cada vez que haya acumulado una única "unidad" de salida.
Si está escribiendo más de BUFSIZ
bytes a la vez, sus escrituras se pueden intercalar. La función setvbuf(3)
puede ayudar a evitar el entrelazado.
Puede ser prematuro hablar de rendimiento, pero el almacenamiento en línea será más lento que el almacenamiento en bloque. Si está registrando cerca de la velocidad del disco, es posible que desee tomar otro enfoque completamente para asegurarse de que sus escrituras no estén entrelazadas.
Posible (mejor) duplicado de [fopen dos procesos] (http://stackoverflow.com/questions/1842909/fopen-two-processes). – blahdiblah
Ver también [¿Se pueden agregar procesos múltiples a un archivo usando fopen sin ningún problema de simultaneidad?] (Http://stackoverflow.com/questions/7552451/can-multiple-processes-appen-to-a-file-using-fopen- sin-ninguna-concurrencia-prob). – blahdiblah
No conozco el contexto del uso de tus registros, pero recomendaría echar un vistazo a 'syslog'. Tal vez te conviene. Trabajar con esto es realmente simple. http://www.gnu.org/software/libc/manual/html_node/Submitting-Syslog-Messages.html –