2013-06-13 70 views
0

我已經成功創建了一個C程序,它運行一個無限循環,等待通過套接字進行連接。 我想使它成爲一個守護進程,並能夠啓動和停止它。我該怎麼做?我應該怎樣改變我的代碼以在後臺運行?D守護進程中的套接字服務器

+1

閱讀'APUE,Stevens和Rago,第13章,守護進程'。 – mohit

+0

你的程序在哪個操作系統上運行? – syler

回答

2

成爲一個守護進程所需的經典任務是:

  1. 更改工作目錄到根,讓你的守護程序不腳另一個安裝;
  2. 請致電fork()並有父母退出,以便該過程不是過程組長;
  3. 將標準輸入,標準輸出和標準錯誤重定向到/dev/null;
  4. 呼叫setsid()使過程成爲沒有控制終端的新會話的會話組領導。

沒有錯誤檢查:

chdir("/); 

if (fork() > 0) 
    _exit(); 

close(0); 
close(1); 
close(2); 
open("/dev/null", O_RDWR); 
dup(0); 
dup(0); 

setsid(); 

在Linux上,glibc的提供了一個daemon()輔助函數來執行這些任務。

+0

守護進程()也存在於非Linux系統上,儘管它不可​​移植。 –

+0

此答案在調用setsid時不會忽略SIGHUP,以防止父會話阻止組長對_exit(2)調用終止子進程 –

1

要運行一個c程序作爲後臺程序,您需要執行以下步驟。

// Create child process 
process_id = fork(); 

//unmask the file mode 
umask(0); 

//change the directory as your home directory 
strcpy(home,"HOME");                     
home=getenv(home); 
chdir(home) ; 


//set new session 
sid = setsid(); 
close(STDIN_FILENO); open("/dev/null", O_RDWR); 
close(STDOUT_FILENO); open("/dev/null", O_RDWR); 
close(STDERR_FILENO); open("/dev/null", O_RDWR); 
+0

這是錯誤的:更改爲/而不是HOME。 umask不是必需的。 –

相關問題