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