deamon守护进程

在linux下的一种特殊进程称为守护进程,其作用是在后台默默提供服务的,随系统结束而结束,或者是kill -9 的信号结束
daemon,表示守护进程,简称为d(进程名后面带d的基本就是守护进程)

ps -aux 

命令得到的程序中在tty 一栏中为?的皆为守护进程,说明不隶属于任何的控制台的程序。

一般我们在终端中执行的程序其父进程都是bash ,子进程在bash结束后,会被回收

实现守护进程有以下的几个步

  1. 子进程等待父进程退出
  2. 子进程使用setsid创建新的会话期,脱离控制台
  3. 调用chdir将当前工作目录设置为/
  4. umask设置为0以取消任何文件权限屏蔽
  5. 关闭所有文件描述符
  6. 将0、1、2定位到/dev/null

  • 通过在父进程中执行 exit() 先于子进程退出
    这样子进程的父进程就自动的切换为了init
  • chdir(“/”); 切换工作目录为根目录
  • umask();
  • close();所有的打开的文件描述符
  • open(/dev/null)连续三次,使得STDIN,STDOUT,STDERR,都对应的是/dev/null也算是系统的垃圾桶
  • 这样就可以实现一个守护进程

下面是实现的代码demo:

void deamon_creator(char *cmd)  
{  
    pid_t pid;  
    int i;  
    int fd0, fd1, fd2;  

    if ( (pid = fork()) < 0){  
        printf("fork failed\n");  
        return;  
    }  
    else if (pid > 0){    //the parent process terminate!  
        exit(0);  
    }  

    if (setsid() < 0){    //set the sid  
        printf("setsid failed\n");  
        return;  
    }
    for (i = 0; i < sysconf(OPEN_MAX); i++){    //get the num of max_opened  
        close(i);  
    }  

    if (chdir("/") < 0){  
        printf("chdir failed\n");  
        return;  
    }  

    umask(0);    //set the mask  

    fd0 = open("dev/null", O_RDWR);  
    fd1 = dup(0);  
    fd2 = dup(0);   //copy the fd one by one
    for(;;);
}

你可能感兴趣的:(Linux,C)