設計一個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這個檔案裡面不會有顯示。