后台守护进程的创建
damon.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include<signal.h>
#include<time.h>
#include<syslog.h>
//初始化后台守护进程
int init_diamon(void){
int pid;//进程
int i;
//忽略终端io信号 和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);
//忽略信号
signal(SIGCHLD,SIG_IGN);
return 0;
}
int main(void){
time_t now;
init_diamon();
syslog(LOG_INFO|LOG_USER,"测试守护进程\n");
while(1){
sleep(8);
time(&now);
syslog(LOG_INFO|LOG_USER,"系统时间:\t%s\t\n",ctime(&now));
}
}
gcc -o demon demon.c
./demon
验证 ps aux|grep demon
tail -f /var/log/syslog
Aug 10 11:25:50 SERVER demon: 系统时间:#011Wed Aug 10 11:25:50 2016
Aug 10 11:25:58 SERVER demon: 系统时间:#011Wed Aug 10 11:25:58 2016
Aug 10 11:26:06 SERVER demon: 系统时间:#011Wed Aug 10 11:26:06 2016
Aug 10 11:26:14 SERVER demon: 系统时间:#011Wed Aug 10 11:26:14 2016
Aug 10 11:26:22 SERVER demon: 系统时间:#011Wed Aug 10 11:26:22 2016
Aug 10 11:26:30 SERVER demon: 系统时间:#011Wed Aug 10 11:26:30 2016