2009-02-27 8 views
7

¿Es fprintf seguro para subprocesos? The glibc manual parece decir que sí, pero mi aplicación, que escribe en un archivo usando una sola llamada a fprintf(), parece estar entremezclando escrituras parciales de diferentes procesos.¿La implementación de glibc de fprintf() es segura para subprocesos?

editar: Para aclarar, el programa en cuestión es un complemento lighttpd, y el servidor se está ejecutando con varios subprocesos de trabajo.

Al mirar el archivo, algunas de las escrituras se entremezclan.

editar 2: Parece que el problema que estoy viendo que podría deberse a "subprocesos de trabajo" de lighttpd en realidad son procesos separados: http://redmine.lighttpd.net/wiki/lighttpd/Docs:MultiProcessor

Problemas

Mediante la ejecución de 2 o más procesos en el mismo socket tendrá una mejor concurrencia , pero tendrá algunos inconvenientes que debe tener en cuenta de:

  • mod_accesslog podría crear registros de acceso rotos, ya que el mismo archivo se abre dos veces y NO está sincronizado.
  • mod_status tendrá n contadores separados, un conjunto para cada proceso .
  • mod_rrdtool fallará ya que recibe la misma marca de tiempo dos veces.
  • mod_uploadprogress no mostrará el estado correcto.
+0

¿Está observando esto en un archivo que escribe con 'fprintf', o lo está observando en las corrientes' stdout' y 'stderr'? –

Respuesta

14

estás confundiendo dos conceptos - escritura de múltiples hilos y escritura de múltiples procesos.

Dentro de un proceso es posible asegurar que una invocación de fprintf se complete antes de que el siguiente tenga acceso al búfer de salida, pero una vez que su aplicación bombea esa salida a un archivo quedará a merced del SO. Sin algún tipo de mecanismo de bloqueo basado en el sistema operativo, no puede garantizar que una aplicación completamente diferente no escriba en su archivo de registro.

7

Me parece que tiene que leer en file locking. El problema que tiene es que varios procesos (es decir, no subprocesos) están escribiendo en el mismo archivo simultáneamente y no hay una manera confiable de asegurar que las escrituras sean atómicas. Esto puede dar como resultado que los archivos sobrescriban las escrituras de los demás, la salida mixta y el comportamiento no determinista en general.

Esto no tiene nada que ver con Seguridad de subprocesos, ya que esto es relevante solo en programas de subprocesos múltiples de procesos únicos.

2

El estándar actual de C++ no dice nada útil sobre la concurrencia, ni el estándar de 1990 C. (No he leído el estándar C de 1999, por lo que no puedo comentar sobre él; el próximo estándar C++ 0x dice cosas, pero no sé exactamente qué tipo de información.)

Esto significa que fprintf () en sí mismo no es seguro para subprocesos ni de otro modo, y que dependería de la implementación. Leí exactamente lo que dice la documentación de glibc al respecto, y lo comparo exactamente con lo que estás haciendo.

Cuestiones relacionadas