守护进程一

浪子不回头ぞ 提交于 2020-03-17 19:47:53

守护进程

什么是守护进程

守护进程是生存期长的一种进程。他们常在系统引导时装入,仅在系统关闭时才终止。因为他们没有控制终端,所以说他们是后台运行的。

如何创建守护进程

1.调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0).
2.调用fork(),然后使父进程exit。

1.如果该守护进程是作为shell命令启动的,可以让shell以为该命令已执行完毕
2.保证该进程不是一个进程组的组长进程

3.调用setsid创建一个新会话

1.成为新会话首进程
2.成为新进程组,组长进程
3.无控制终端

4.将当前目录更改为根目录
5.关闭不再需要的文件描述符
6.某些守护进程打开/dev/null/使其具有文件描述符,这样任何一个企图读标准输入,写标准输出,错误输出的都不会产生效果。
注:也可以在第三步后再次fork,终止父进程,保证该进程不是会话首进程

实例:

#include<apue.h>
#include<syslog.h>
#include<fcntl.h>
#include<sys/resource.h>
void demonize(const char *cmd)
{
    int i,fd0,fd1,fd2;
    pid_t pid;
    struct rlimit rl;
    struct sigaction sa;

    umask(0);    //设置文件创建屏蔽字
    if((pid=fork())<0)
      err_quit("%s;can't fork",cmd);
    else if(pid!=0)
      exit(0);        //父进程

    setsid();
    sa.sa_handler=SIG_IGN;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags=0;
    if(sigaction(SIGHUP,&sa,NULL)<0)
      err_quit("%s:can't ignore SIGHUP",cmd);
    if((pid=fork())<0)
      err_quit("%s,can't fork",cmd);
    else if(pid!=0)
      exit(0);
    if(chdir("/")<0)
      err_quit("%s,can't chdir",cmd);
    if(getrlimit(RLIMIT_NOFILE,&rl)<0)
      err_quit("%s:can't get gile limit",cmd);
    if(rl.rlim_max==RLIM_INFINITY)
      rl.rlim_max=1024;
    for(i=0;i<rl.rlim_max;i++)
      close(i);

    fd0=open("/dev/null",O_RDWR);
    fd1=dup(0);
    fd2=dup(0);
}
int main()
{
   demonize("hello");
   sleep(60);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!