1.使守护进程忽略信号影响(父进程退出时会给子进程发SIGHCP的信号,对应子进程退出发出SIGCHLD(child)信号)
signal(SIGUP, SIG_IGN)(signal up, signal ignore) 原型sighandler_t signal(int signum, sighandler_t handler)
2.使守护进程脱离终端控制,不受终端影响。(这里也同时摆脱了原会话和会话组) A 用户一登录一个会话就开始了,假设这个会话组有个领头进程P
B P ---第一次fork---得到子进程P',顺便(exit(0))结束掉领头P的进程<有了第1步骤,父进程退出使不造成影响>,
让P‘成为孤儿进程,造成程序已经完毕的假象,摆脱终端影响
3.创建新会话,来摆脱原会话控制,当然原进程组合原终端的控制也都摆脱了 setsid();这个函数使用后,P'成为新会话组的领头进程了(组长)
4.进一步削弱 P'(领头进程)的影响,因为如果再打开一个终端的话,将会受到他的直接控制
A P' ---第二次fork---得到P”,为了继续摆脱终端的影响,紧接着再(exit(0)) 结束掉组长的进程
B 此时进程P\"还差摆脱进程组的控制,就可以成为守护进程了。所以 setpgrp(),成为新组的组长了,P“成为守护进程了 PS:P->P’->P'' 的步骤都是为了摆脱A会话和会话组B控制终端和C进程组的影响,成为一个独立的不受影响的后台服务进程
5.剩下的工作就是对守护进程的细节的处理了,就是为了摆脱父亲的控制
A:关闭从父进程继承的一切文件描述符(固定格式:max_fd = sysconf(_SC_OPEN_MAX);for(i=0;i --------------------------------------------------------------------------------------------------------------------*/ #include #include #include int main(void) { int i, fd; long max_fd; pid_t pid; char buf[] = \"如果你看到这句话,代表本守护进程创建成功\"; signal(SIGHUP, SIG_IGN);//忽略信号影响 signal(SIGTSTP, SIG_IGN); pid = fork();//第一次fork() if(pid > 0) exit(0); setsid();//创建新会话组 pid = fork();//第二次fork() if(pid > 0) exit(0); setpgrp();//摆脱原进程组 max_fd = sysconf(_SC_OPEN_MAX);//关闭从父进程继承的一切文件描述符 for(i=0; i //一定要加sudo 来运行本C程序 return 0; } 因篇幅问题不能全部显示,请点此查看更多更全内容