zoukankan      html  css  js  c++  java
  • 守护进程一

    守护进程

    什么是守护进程

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

    如何创建守护进程

    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);
    }
    
    
  • 相关阅读:
    前端学习:html基础学习四
    前端学习:html基础学习三
    cogs 2691. Sumdiv
    cogs 421. HH的项链
    Bzoj 2038: [2009国家集训队]小Z的袜子(hose)
    【NOIP模拟赛】密码锁
    cogs1612. 大话西游
    cogs1583. [POJ3237]树的维护
    Bzoj 3343: 教主的魔法
    SPOJ375 Query on a tree
  • 原文地址:https://www.cnblogs.com/battzion/p/4152225.html
Copyright © 2011-2022 走看看