¿Es fwrite atómico?

Una simple pregunta:

Necesito agregar algo de registro a mi progtwig.

Si dos procesos usan “fwrite” en el mismo archivo pero no el mismo descriptor de archivos, los mensajes de registro escritos serán atómicos o mixtos. ¿Hay un límite de longitud?

¿Está definido el comportamiento o implementación ANSI-C definido? Si más tarde, ¿qué hay en MacOSX, Linux y Windows MSVC?

Se puede mezclar.

Si tiene más de un hilo / proceso de escritura en el mismo archivo, necesita usar el locking.

Una alternativa es enviar mensajes de registro a un servicio / subproceso dedicado. Una excelente herramienta para adoptar es syslog , que seguramente se instala en todos los Unix y se puede ejecutar en Windows .

Después de hacer algunas investigaciones y he encontrado lo siguiente en este enlace :

El estándar POSIX requiere que las operaciones de C * Archivo * sean atómicas. Las bibliotecas C que cumplen con POSIX (por ejemplo, en Solaris y GNU / Linux) tienen un mutex interno para serializar las operaciones en los ARCHIVOS *.

Parece que las llamadas deben ser atómicas, pero depende de su plataforma. En el mismo enlace, también hay otro párrafo que le permite pensar que el progtwigdor debe tener cuidado:

Por lo tanto, para la versión 3.0, la pregunta “es multihilo seguro para E / S” debe responderse con “¿es la biblioteca C de su plataforma segura para la E / S?” Algunos son por defecto, otros no; muchos ofrecen implementaciones múltiples de la biblioteca C con diversos compromisos de seguridad y eficiencia de subprocesos. Usted, el progtwigdor, siempre debe tener cuidado con varios subprocesos.

Además, como tiene dos FILE* diferentes en dos procesos diferentes, creo que no tiene otra opción.

Desde “man flockfile” en Debian lenny, las funciones de stdio son seguras para subprocesos.

Hay funciones stdio inseguras de subprocesos, “man unlocked_stdio” para más detalles.

Puede obtener más información en la página de manual.

fwrite para visual studio bloquea el subproceso de llamada y, por lo tanto, es seguro para subprocesos