完整代碼如下:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>
#include<sys/param.h>
#include<sys/stat.h>
#include<time.h>
#include<syslog.h>
int init_daemon(void)
{
int pid;
int i;
/*忽略終端I/O信號與STOP信號*/
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGHUP,SIG_IGN);
pid=fork();
if(pid>0){
exit(0);/*結束父進程,使得子進程成爲後臺進程。*/
}else if(pid<0){
return -1;
}
/*建立一個新的進程組,在這個新進程組中,子進程成爲這個進程組的首進程,以使該進程脫離所有終端*/
setsid();
/*再次新建一個子進程,退出父進程,保證該進程不是進程組長,同時讓該進程無法再打開一個新的終端*/
pid=fork();
if(pid>0){
exit(0);
}
else if(pid<0){
return -1;
}
/*關閉所有從父進程繼承的不再需要的文件描述符*/
for(i=0;i<NOFILE;close(i++));
/*改變工作目錄,使得進程不與任何文件系統聯繫*/
chdir("/");
/*將文件屏蔽字設置爲0*/
umask(0);
/*忽略SIGCHLD信號*/
signal(SIGCHLD,SIG_IGN);
return 0;
}
int main(){
time_t now;
init_daemon();
syslog(LOG_USER|LOG_INFO,"測試守護進程!\n");
while(1){
sleep(8);
time(&now);
syslog(LOG_USER|LOG_INFO,"系統時間:\t\%s\t\t\n",ctime(&now));
}
}
爲保證本實例正常運行,請配置如下內容;
#vim /etc/rsyslog.conf
最未尾增加:
user.* /var/log/test.log
啓動rsyslog
/etc/init.d/rsyslog restart
=============================
結果如下:
root@ubuntu:/var/log# tail -f /var/log/test.log
Apr 26 02:06:30 ubuntu daemon: 系統時間:#011Sun Apr 26 02:06:30 2015#012#011#011
Apr 26 02:06:38 ubuntu daemon: 系統時間:#011Sun Apr 26 02:06:38 2015#012#011#011
Apr 26 02:06:46 ubuntu daemon: 系統時間:#011Sun Apr 26 02:06:46 2015#012#011#011
Apr 26 02:06:54 ubuntu daemon: 系統時間:#011Sun Apr 26 02:06:54 2015#012#011#011
Apr 26 02:07:02 ubuntu daemon: 系統時間:#011Sun Apr 26 02:07:02 2015#012#011#011
Apr 26 02:07:10 ubuntu daemon: 系統時間:#011Sun Apr 26 02:07:10 2015#012#011#011
Apr 26 02:07:18 ubuntu daemon: 系統時間:#011Sun Apr 26 02:07:18 2015#012#011#011
Apr 26 02:07:26 ubuntu daemon: 系統時間:#011Sun Apr 26 02:07:26 2015#012#011#011
Apr 26 02:07:34 ubuntu daemon: 系統時間:#011Sun Apr 26 02:07:34 2015#012#011#011
Apr 26 02:07:42 ubuntu daemon: 系統時間:#011Sun Apr 26 02:07:42 2015#012#011#011
Apr 26 02:07:50 ubuntu daemon: 系統時間:#011Sun Apr 26 02:07:50 2015#012#011#011