Tengo un proceso de abrir un archivo en modo append. En este caso se trata de un archivo de registro. Ejemplo de código:

int main(int argc, char **argv) {
    FILE *f;
    f = fopen("log.txt", "a");
    fprintf(f, "log entry line");
    fclose(f);
}

Dos preguntas:

  1. Si tengo varios procesos anexando al mismo archivo, cada línea de registro aparecen claramente o pueden estar entrelazados como los procesos de cambio de contexto?
  2. Será este bloque de escritura si muchos de los procesos que requieren el acceso al archivo, por lo tanto, causando problemas de simultaneidad?

Estoy considerando hacer esto en su forma más simple encarnación o el uso de zeromq a la bomba de registro de entradas sobre las tuberías para un recopilador de logs.

Me hizo considerar la posibilidad de syslog, pero realmente yo no quiero cualquier plataforma dependencias en el software.

La plataforma por defecto es Linux para este btw.

OriginalEl autor Deleted | 2011-09-26

6 Comentarios

  1. 6

    Que sin duda va a tener la plataforma de dependencias, ya que Windows no puede manejar varios procesos anexando al mismo archivo.

    Con respecto a los problemas de sincronización, creo que la línea de búfer de salida //debe guardar la mayor parte del tiempo, es decir, más del 99,99% de registro breves líneas deben estar intactos según mi corta a base de concha de prueba, pero no todo el tiempo. Explícito semántica son sin duda preferible, y ya que usted no será capaz de escribir este hack sistema independiente de todos modos, me gustaría recomendar un syslog enfoque.

    Gracias – eso es justo lo que yo quería saber. Las Ventanas múltiples anexando es lo que yo estaba un poco preocupado.

    OriginalEl autor thiton

  2. 10

    Yo no sé acerca de fopen y fprintf pero usted podría open el archivo con O_APPEND. A continuación, cada write va a ir al final del archivo sin problemas (sin llegar a mezclarse con otra escritura).

    Buscando realmente en el estándar:

    El descriptor de fichero asociado con el abierto corriente será
    asignado y se abrió como si de una llamada a open() con el siguiente
    banderas:

    a or ab          O_WRONLY|O_CREAT|O_APPEND

    Así que supongo que es seguro fprintf de múltiples procesos mientras el archivo se ha abierto con a.

    Usted todavía tiene que cambiar el almacenamiento en búfer de tener o no la línea. Con búfer completo se puede ejecutar fuera de búfer en el medio de la entrada y llame a escribir con eso.
    Hudec Que es correcto. Sin embargo, otra razón para utilizar write(2) directamente.

    OriginalEl autor cnicutar

  3. 7

    La estándar (para abrir/escritura, no fopen/fwrite) los estados que

    Si el O_APPEND bandera del archivo de los indicadores de estado se establece, el desplazamiento de archivo se pondrá al final del archivo antes de escribir y no intervenir modificación del archivo de la operación se producirá entre cambiar el desplazamiento de archivo y la operación de escritura.

    Para fprintf() a ser utilizado, deberá deshabilitar el almacenamiento en búfer en el archivo.

    Importante: para los open/write, no fopen/fwrite.
    A la derecha, pero write() «se encuentra en» fwrite() y fprintf(), es decir, es utilizado por ellos. Si el búfer está deshabilitado, incluso es utilizada 1:1. (Pero mejor ser explícito acerca de que, por lo que está a la derecha.)
    No hay necesidad para deshabilitar el almacenamiento en búfer para que esto funcione. En realidad la línea de almacenamiento en búfer ayuda a garantizar que toda líneas están escritas en un tiempo
    Sí, write «se encuentra en» fwrite, pero nada se especifica que fwrite pasa los datos a write en una sola pieza. En la práctica, si el búfer está apagado del todo o de la línea de almacenamiento en búfer y la línea no supere el tamaño del búfer.
    aunque escribir garantiza la atomicidad, el orden de escritura de los dos procesos depende del sistema operativo. Por lo tanto, incluso si process1 invoca write() antes de escribir() de 2, el orden de los datos depende del sistema operativo. Por lo tanto, para garantizar el orden, el uso de exclusión mutua es la mejor apuesta.

    OriginalEl autor glglgl

  4. 3

    Cuando los procesos se va a escribir algo como:

    "Here's process #1"
    "Here's process #2"

    usted probablemente va a obtener algo como:

    "Hehere's process #2re's process #1"

    Tendrá que sincronizar.

    OriginalEl autor Andrey Atapin

  5. 3

    EDITAR para responder a sus preguntas de forma explícita:

    1. Si tengo varios procesos anexando al mismo archivo, cada línea de registro aparecen claramente o pueden estar entrelazados como los procesos de cambio de contexto?

    Sí, cada línea de registro aparecerá intacto, porque de acuerdo a msdn/vs2010:

    «Esta función [que es, fwrite( )] bloquea el subproceso de llamada y por lo tanto es seguro para subprocesos. Para un no-bloqueo de la versión, consulte _fwrite_nolock.«

    La misma está implícita en GNU página del manual:

    «— Función: size_t fwrite (const void *data, size_t size, size_t count, FILE *stream)

    This function writes up to count objects of size size from the array data, to the stream stream. The return value is normally count, if the call succeeds. Any other value indicates some sort of error, such as running out of space. 

    — Función: size_t fwrite_unlocked (const void *data, size_t size, size_t count, FILE *stream)

    The fwrite_unlocked function is equivalent to the fwrite function except that it does not implicitly lock the stream.
    
    This function [i.e., fwrite_unlocked( )] is a GNU extension. "
    1. Será este bloque de escritura si muchos de los procesos que requieren el acceso al archivo, por lo tanto, causando problemas de simultaneidad?

    Sí, por la implicación de la pregunta 1.

    Gracias por la respuesta. El potencial problema que tengo es el de concurrencia para el cierre de la causa de los problemas. He upvoted como el caso de uso es todavía válida y descriptivo. Gracias de nuevo!
    Oh, yo finalmente lo consigo. Por «la concurrencia problema» tienes miedo de que process2 se bloque, mientras que process1 está tratando de escribir en el archivo de registro. He editado mi respuesta para abordar ambas cuestiones de forma explícita.
    Ese es el uno 🙂 – gracias de nuevo por tu respuesta de todos modos. Me gustaría utilizar esta en baja concurrencia de los requisitos.

    OriginalEl autor Pete Wilson

  6. 1

    A menos que hagan algún tipo de sincronización de las líneas de registro se pueden solapar. Así que para responder a la número dos, que depende de cómo implementar el registro y bloqueo de código. Si usted acaba de bloqueo, escribir el archivo y desbloquear, que puede causar problemas si usted tiene un montón de procesos que intentan acceder al archivo al mismo tiempo.

    OriginalEl autor harald

Dejar respuesta

Please enter your comment!
Please enter your name here