Эффективное решение для ведения журнала для нескольких потоков в C - PullRequest
2 голосов
/ 11 сентября 2011

У меня есть программа на C, которая имеет несколько рабочих потоков.Существует основной поток, который периодически (каждые 0,2 с) выполняет некоторые основные проверки (т. Е. Завершил ли поток, получил ли он сигнал и т. Д.).При каждой проверке я хотел бы записать в файл журнала любые данные, которые любой из потоков может иметь в своем буфере журнала, в один файл журнала.

Моя первоначальная идея состояла в том, чтобы просто открыть файл журнала, записать данные из всех потоков и затем снова закрыть его.Я беспокоюсь, что это может быть слишком сложно, поскольку эти проверки происходят каждые 0,2 с.

Итак, мой вопрос - неэффективен ли этот сценарий?

Если да, может ли кто-нибудь предложить лучшее решение?

Я думал о том, чтобы оставить дескриптор файла открытым и просто записывать новые данные при каждой проверке, но тогда возникает проблема, если каким-либо образом физический файл удаляется, программа никогда не узнает (без перепроверки, и в этом случаемы могли бы просто открыть файл снова), и данные журнала будут потеряны.

(Эта программа предназначена для работы в течение очень длительных периодов времени, поэтому тот факт, что файл журнала будет удален в какой-то момент, в основном гарантирован из-за ротации журнала.)

Ответы [ 2 ]

5 голосов
/ 11 сентября 2011

Я думал о том, чтобы оставить дескриптор файла открытым и просто записывать новые данные при каждой проверке, но тогда возникает проблема, если каким-либо образом физический файл удаляется, программа никогда не узнает (без перепроверки, и в этом случаемы могли бы просто открыть файл снова), и данные журналирования были бы потеряны.

Стандартное решение в UNIX - добавить обработчик сигнала для SIGHUP, который закрывает и повторно открывает файл журнала. Многие демоны UNIX делают это именно для этой цели, чтобы поддерживать ротацию журналов.Вызовите kill -HUP <pid> в вашем скрипте ротации журналов, и все готово.

( Некоторые программы также будут воспринимать SIGHUP как сигнал для повторного чтения своих файлов конфигурации, так что вы можетевносить изменения в конфигурацию на лету без необходимости перезапуска процессов.)

1 голос
/ 11 сентября 2011

В настоящее время хорошего решения не так много. Я бы предложил написать таймер, который запускается отдельно от вашей основной проверки 0.2s, проверяет буферы лог-файла и записывает их на диск.

Я работаю над сетью, которая могла бы решить эту проблему (у меня была такая же проблема) с превосходной производительностью, отправьте мне сообщение на github для подробностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...