2013-08-22 164 views
0

我有一個用C++編寫的服務器程序,用於管理用戶瀏覽器和硬件設備之間的流量。這臺服務器運行在我的centos機器上。 當我正常運行程序時,它運行沒有任何問題。C++守護進程服務器停止

但試圖將該程序作爲守護程序運行會引發一些問題。 這是我的守護代碼:

pid_t pid, sid; 

pid = fork(); 
if(pid < 0){ 
    exit(EXIT_FAILURE); 
} 

if(pid > 0) { 
    exit(EXIT_SUCCESS); 
} 

umask(0); 

sid = setsid(); 
if(sid < 0){ 
    exit(EXIT_FAILURE); 
} 

if((chdir("/")) < 0){ 
    exit(EXIT_FAILURE); 
} 

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

while(1){ 
    //my program here 
} 

程序啓動正常,它的母公司是init。 它可以運行幾個小時,但是當我發出大約10-15個請求時,它停止。

我相信代碼作爲deamon運行我的程序是正確的。 我擔心的是我的實際代碼。 我有什麼規定要遵循? 我應該避免的任何不良行爲? 守護進程不允許的任何命令,如命令行輸出(目前我做了很多)等等?

+2

http://stackoverflow.com/questions/3095566/linux-daemonize我認爲你必須關閉或重定向你的stdout和stderr,或者根本不寫信給他們。或者使用守護進程或任何其他工具來將「正常」程序作爲守護進程運行。 –

+0

刪除所有的輸出做了訣竅。現在一切正常。 – megadave

回答

0

只需關閉stdoutstderr將使所有寫入失敗。我猜你的程序會遇到這樣的錯誤,檢測並終止。標準技術是打開/dev/nulldup2(2)它到STDOUT_FILENO,STDERR_FILENOSTDIN_FILENO