daemon.c文件:
// daemon.c
#include<stdio.h>
#include<signal.h>
#include<sys/param.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdlib.h>
int init_daemon(void)
{
pid_t pid;
int i;
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;
}
test.c文件:
// test.c
#include<stdio.h>
#include<time.h>
#include<syslog.h>
extern int init_daemon(void);
int main()
{
time_t now;
init_daemon(); //初始化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 ));
}
}
(✿◠‿◠)
来源:https://www.cnblogs.com/leokale-zz/p/12163493.html