LINUX.ORG.RU

logging && fork()


0

0

Стандартная задача: есть программа, и несколько fork()'ов в ней. Каждый child должен писать в один и тот же файл: иногда в разные промежутки времени, иногда практически одновременно (depends on internal conditions). Как правильно разделить доступ к лог-файлу, при условии, что ни одно сообшение не должно быть потеряно? Использовать flock() для файла, или есть более "прямой" способ? Заранее спасибо.

использование syslog() в данной задаче не применимо. Портабельность важна на уровне Linux и *BSD.

anonymous

flock.

зачем придумывать иные костыли?

asgard
()

flock, но только если не real time

theserg ★★★
()

Все проще.

Если файл-дескриптор открыт в общем предке с O_APPEND, в блокирующем режиме 
и запись осуществлять без буферизации (в смысле, в stdio, iostream и т.п.) - то все синхронизируется 
"само", в ядре.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <stdlib.h>
#include <unistd.h>

#include <string.h>

int main() {
    int f, i;
    char buf[60];

    f = open("logfile", O_RDWR | O_CREAT | O_APPEND | O_TRUNC, S_IRWXU);
    if (f == -1) {
        perror("open logfile:");
        exit(1);
    }
    if (fork() < 0) {
        perror("fork: ");
        exit(2);
    }
    for(i =0; i<1000; i++) {
        sprintf(buf, "%d %d\n", getpid(), i);
        write(f, buf, strlen(buf));
        usleep(1); //to make scheduler's life somewhat harder
    }
}

anonymous
()
Ответ на: комментарий от anonymous

Да, собственно, рекомендуется сравнить с вариантом, когда fork делается _до_ open.

А usleep я зра поставил - без него нагляднее. В результирующем файле в приведенной программе (что с usleep, что без) получается 2000 строк, а если переставить fork и open - случайное число от 1000 до 2000 - у меня, например, 1886

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.