2015-10-21 3 views
1

У нас есть код linux, который отделяет терминал от реализации на основе найденной на http://www.itp.uzh.ch/~dpotter/howto/daemonize.linux: закрыть или перенаправить стандартный вывод на/dev/null после отсоединения от терминала

Вот фрагмент кода из него:

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

kill(parent, SIGUSR1); 
} 

Вместо перенаправлении /разработчика/нуль Я могу просто закрыть стандартных дескрипторов файлов следующим образом и достичь того же результата:

close(STDIN_FILENO);  
close(STDOUT_FILENO); 
close(STDERR_FILENO); 

На данный момент я немного зациклен на том, какой подход использовать: перенаправить или закрыть? каковы потенциальные проблемы каждого подхода?

ответ

4

Вы можете сделать это, но перенаправление на /dev/null безопаснее и проще.

Если вы решили закрыть, вы должны убедиться, что все внешние программы или библиотеки, которые вы вызываете, все еще работают, когда stdin/stdout/stderr закрыт. Библиотеки и структуры отличаются тем, как они справиться с этим:

  • Shell скрипты могут прервать или безобразничать, как echo неожиданно возвращается неуспеха.
  • Программы Python будут видеть, что произвольная инструкция печати терпит неудачу с исключениями, когда записывается основной буфер.
  • Ruby просто игнорирует его.

Даже если ваши запущенные программы или библиотеки, как правило, ничего не печатают, вы не знаете, что это за условное ведение журнала и как они обрабатывают ошибки там.

Если не запущен весь код, который не имеет стандартного ввода-вывода, лучше просто перенаправить его.

Смежные вопросы