2010-02-08 13 views
10

Una simple pregunta:¿Es fwrite atómico?

Necesito agregar algo de registro a mi programa.

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

¿Está definido el comportamiento ANSI-C o la implementación definida? Si lo último está en MacOSX, Linux y Windows MSVC?

+0

Por experiencia, las tareas de mayor prioridad/hilo poner su texto en alguna parte del texto de un hilo de menor prioridad. Esto se puede resolver haciendo que una salida de tarea de una cola y otra tarea se agreguen a la cola. –

Respuesta

3

Se puede mezclar.

Si tiene más de un hilo/proceso escribiendo en el mismo archivo, debe usar el bloqueo.

Una alternativa es enviar mensajes de registro a un servicio/hilo dedicado. Una herramienta excelente para adoptar es syslog, que seguramente está instalado en todos los unixes y se puede ejecutar en Windows.

14

Después de investigar y he encontrado lo siguiente en este link:

estándar POSIX requiere que C Stdio ARCHIVO * operaciones son atómicos. Las bibliotecas C conformes con POSIX (por ejemplo, en Solaris y GNU/Linux) tienen un mutex interno para serializar las operaciones en FILE * s.

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

Por lo tanto, para la versión 3.0, la cuestión de la "es multihilo seguro para E/S" debe ser respondió con, "¿Es la biblioteca C de su plataforma segura para E/S?" Algunos son de forma predeterminada, otros no; muchos ofrecen implementaciones múltiples de la biblioteca C con intercambios variables de threadsafety y eficiencia. Usted, el programador , siempre se requiere que tenga cuidado con varios subprocesos.

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

+0

¿Pero cada proceso tiene su propio ARCHIVO? – Will

+0

@Will: su derecha. Actualizado, gracias! – yeyeyerman

+1

También en Windows, 'fwrite' es atómico.[fuente] (https://msdn.microsoft.com/en-us/library/h9t88zwz.aspx?f=255&MSPPError=-2147217396): * Debido a que esta función bloquea el hilo de llamada, es seguro para subprocesos. Para una versión sin bloqueo, consulte _fwrite_nolock. * – rustyx

1

Desde "man flockfile" en Debian lenny, las funciones stdio son seguras para subprocesos.

Hay funciones stdio de subprocesos inseguros, "man unlocked_stdio" para más detalles.

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

-1

fwrite para Visual Studio se bloquea el subproceso de llamada y por lo tanto es seguro para subprocesos

Cuestiones relacionadas