分享

守候进程编程要点

 champion_xu 2012-05-03
守候进程(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);


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多