linux下的deamon進程

來源:互聯網
上載者:User

設計一個linux下的deamon進程,關鍵只有幾個:

1.fork兩次。
2.fork第一次和第二次之間成為進程組頭。
3.改變工作目錄。
4.忽略訊號。
5.設定讀寫掩碼。

一下是一個從網路搜集到的常式,非常好的示範了上述要點,存此備忘。

#include
#include
#include
#include

void main(int argc, char ** argv)
{
time_t now;
int childpid, fd, fdtablesize;
int error, in, out;

/*忽略終端 I/O訊號,STOP訊號*/
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGHUP,SIG_IGN);

/*父進程退出,程式進入後台運行*/
if( fork()!=0 )
{
exit(1);
}
if( setsid()<0 )
{
exit(1); /*建立一個新的會議組*/
}

/*子進程退出,孫進程失去控制終端了*/
if( fork()!=0 )
{
exit(1);
}
if( chdir("/tmp")==-1 )
{
exit(1);
}

/*關閉開啟的檔案描述符,包括標準輸入、標準輸出和標準錯誤輸出*/
fd=0;
for(fdtablesize=getdtablesize(); fd< fdtablesize;fd++)
{
close(fd);
}

umask(0);/*重設檔案建立掩碼*/
signal(SIGCHLD,SIG_IGN);/*忽略SIGCHLD訊號*/

/*此處,可以做自己想做的服務常式代碼。一般是一個死迴圈,如果要可以控制的退出的話,可以設定擷取訊號。下面樣本一下一個寫log的常式
*/

/*寫log,測試結果*/
syslog(LOG_USER|LOG_INFO,"守護進程測試!/n");

while(1)
{
time(&now);
syslog(LOG_USER|LOG_INFO,"目前時間:/t%s/t/t/n",ctime(&now));
sleep(6);
}
}

上述程式在gcc4.0.1下編譯通過,在fc4-2.6.11下穩定運行。

syslog將串連syslogd這個服務,在/var/log/message這個檔案裡面輸出訊息,所以需要啟動syslogd服務。否則在/var/log/message這個檔案裡面不會有顯示。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.