deamon守护进程

来源:互联网 发布:vb.net winhttp 编辑:程序博客网 时间:2024/06/05 12:42

在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(;;);}
0 0
原创粉丝点击