守候进程(daemon)是在后台运行的进程,脱离于终端。这样他可以不受终端控制的干扰与影响导致退出或者挂起。守候进程运行中不会将任何信息输出到终端显示,因此,他只将信息输出到系统日志中以便查看和调试。 其编程要点: 1.屏蔽可能受影响的信号 signal(SIGTTOU, SIG_IGN);//终端输出信号,会导致进程停止 signal(SIGTTIN, SIG_IGN);//终端输入信号,会导致进程停止 signal(SIGTSTP, SIG_IGN);//终端挂起信号,会导致进程停止 signal(SIGHUP, SIG_IGN);//连接断开信号,会导致进程终止 2.后台运行,即将父进程退出,避免终端挂起 if(pid=fork()) exit(0); //退出父进程 3.脱离终端和进程组,设置为新回话组组长 setsid();//设置新会话组长,因为终端和进程通常会从父进程继承下来,需要摆脱他们 4.禁止进程重新打开控制终端,新会话组长有权打开控制终端,为不让其打开可以不再成为会话组长 if(pid=fork()) exit(0); //退出第一子进程,创建第二子进程,并不设第二子进程为会话组长 5.关闭打开的文件描述符,这些描述符都是从父进程中继承来的,一般不需要,不关闭会造成资源的浪费 for(i=0;i<256;i++) close(i); 6.改变当前目录,进程活动时候,其工作目录所在的文件系统不能卸下,因此一般要将守候进程工作目录设置到根目录下或者一些特殊目录,如/tmp chdir("/"); 7.重设文件创建掩膜,这也是从父进程中继承而来,需要清除 umask(0); 8.处理SIGCHLD信号,最简单就是忽略。对于一些进程来说,特别是服务器往往在请求到来时候生成子进程并处理请求。但是如果父进程不等到子进程结束会造成僵死进程,占用系统资源。而如果要等到子进程结束,势必会造成父进程的负担,对于服务器来说会影响其并发性。 signal(SIGCHLD, SIG_IGN); |
|
来自: champion_xu > 《process》