Снова открыть стандартный вывод для демона linux?

Я понимаю, что демон не должен писать stdout (а также stderr) потому что это не будет доступно после отсоединения от управляющего терминала. Но могу ли я снова открыть stdout в обычный файл, чтобы все мои оригинальные журналы все еще работали? Это было бы очень приятно и полезно для меня.

Я пробовал что-то подобное после разветвления,

freopen("/dev/null/", "r", stdin);
freopen("log", "w", stdout);
freopen("log", "w", stderr);

BOOST_LOG_TRIVIAL(info) << "daemonized!";

Демон может быть запущен (если быть точным, он не выйдет из строя и выйдет), и файл журнала может быть создан. Но журнал пуст (без "демон!"). Разве это не правильный способ демонизации? Может ли кто-то пролить свет?

1 ответ

Есть функция библиотеки, daemon(int nochdir, int noclose), это доступно, чтобы помочь коду надлежащим образом демонизировать и дополнительно открыть стандартные потоки ввода / вывода, подключенные к /dev/null, Используя это и средство системного журнала (как syslog) я бы выбрал "правильный" способ демонизации.

Наличие стандартных потоков ввода-вывода, открытых и связанных с /dev/null обеспечит преимущество, позволяющее избежать любых сбоев из-за любых перенесенных операций ввода-вывода с ними (которые могут, например, заблокировать процесс или вызвать неожиданный сигнал). Это дополнительно предотвратит непредвиденное получение любых новых дескрипторов и непреднамеренное получение результата от, скажем, перенесенного printf заявления.

Что касается связывания стандартных потоков ввода-вывода с обычным файлом, то следующее предупреждение в Интернете daemonize Справочная страница программы кажется полезной для распознавания:

Будьте осторожны, когда вы перенаправляете вывод! Файловая система, содержащая открытый файл, не может быть размонтирована, пока файл открыт. Для достижения наилучших результатов убедитесь, что этот выходной файл находится в той же файловой системе, что и рабочий каталог демона.

Другие вопросы по тегам