Pregunta

Es fprintf flujos seguros? El glibc Manual parece decir que es , pero mi solicitud, que escribe en un archivo usando una sola llamada a fprintf () parece estar entremezclado escrituras parciales de diferentes procesos.

Edit: Para aclarar, el programa en cuestión es un plugin lighttpd , y el servidor se está ejecutando con múltiples subprocesos de trabajo.

Mirando 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: href="http://redmine.lighttpd.net/wiki/lighttpd/Docs:MultiProcessor" rel="nofollow noreferrer"> http: //redmine.lighttpd. net / wiki / lighttpd / Docs: multiprocesador

  

Problemas

     

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

     
      
  • mod_accesslog podría crear registros de acceso rotas, como el mismo archivo se abre dos veces y no está sincronizado.
  •   
  • mod_status tendrá n contadores separados, uno para cada uno   proceso.
  •   
  • mod_rrdtool fallará, ya que recibe la misma marca de tiempo dos veces.
  •   
  • mod_uploadprogress no mostrará el estado correcto.
  •   
¿Fue útil?

Solución

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

Dentro de un proceso de su posible para asegurar que una invocación de fprintf se completa antes de permitir el acceso más próximo al buffer de salida, pero una vez que su aplicación bombas que la salida a un archivo que está a merced del sistema operativo. Sin algún tipo de mecanismo de bloqueo del sistema operativo basado usted no puede garantizar que una aplicación totalmente diferente duerma escribir en el archivo de registro.

Otros consejos

Me parece que es necesario leer el bloqueo de archivos . El problema que tiene es que múltiples procesos (es decir, no threads) están escribiendo en el mismo archivo al mismo tiempo y no hay manera confiable para asegurar que las escrituras será atómica. Esto puede resultar en la sobreescritura de archivos de escritura de cada uno, salida mezclada, y el comportamiento del todo no determinista.

Esto no tiene nada que ver con el hilo de seguridad, ya que esto es relevante sólo en los programas de multiproceso de un solo proceso.

El actual estándar de C ++ no dice nada útil sobre la concurrencia, ni la norma 1990 C. (No he leído la norma C 1999, así que no puedo opinar sobre ellos;. El próximo estándar de C ++ 0x Qué dice cosas, pero no sé exactamente lo improviso)

Esto significa que fprintf () en sí es probable que ninguno de flujos seguros ni de otra manera, y que dependería de la aplicación. Me gustaría leer exactamente lo que la documentación glibc dice acerca de ella, y compararlo con exactamente lo que está haciendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top