2017-03-10 27 views
0

我明白,一個守護進程不應該寫stdout(和stderr),因爲這不會是一次可從控制終端分離。但是,我可以重新打開stdout到一個普通的文件,這樣我所有的原始日誌仍然可以工作嗎?這對我來說是非常好的和有用的。重新打開標準輸出到Linux守護進程的常規文件?

我想是這樣的分叉後,

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

BOOST_LOG_TRIVIAL(info) << "daemonized!"; 

守護程序可以啓動(準確地說,它並沒有失敗,退出),並可以創建日誌文件。但是日誌是空的(沒有「守護進程!」)。這是不是正確的方法來守護?有人可以點亮一些光線嗎?

+0

我認爲你有理由回到前面 - 如果你的'stdout'和/或'stderr'去一個終端,那麼它仍然是你的控制終端,你不能脫離它。我錯了嗎? –

回答

0

有一個庫函數daemon(int nochdir, int noclose),可用於幫助代碼適當地守護進程並重新打開連接到/dev/null的標準I/O流。使用它和一個系統日誌工具(如syslog)將是我作爲一個「正確」的方式進行守護的方式。

使標準I/O流打開並與/dev/null相關聯可以避免任何由於任何剩餘I/O而造成的打嗝(這可能會阻止進程或導致意外的信號)。它會另外阻止任何新的描述從懵懵懂懂獲取這些不知不覺正從說遺留printf報表輸出。

至於標準I關聯/ O與常規文件流,在網上daemonize program手冊頁以下警告似乎認識到有用:

小心你輸出重定向!包含了打開的文件的文件系統不能只要文件被打開被卸載。爲了達到最佳效果,請確保此輸出文件是相同的文件系統守護進程的工作目錄上。

相關問題