Chinaunix首页 | 论坛 | 博客
  • 博客访问: 149811
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-12 15:27
个人简介

文章分类

全部博文(14)

文章存档

2014年(14)

分类: C/C++

2014-02-26 16:26:34

上一篇文章介绍了守护进程的创建过程。其实在linux系统中提供了daemon()函数,用于创建守护进程,原理与上一篇的介绍一样。
作用:使程序以守护进程的方式后台运行。
原型:

点击(此处)折叠或打开

  1. #include <unistd.h>

  2. int daemon(int nochdir, int noclose);
参数:
当 nochdir = 0时,当前目录变为根目录("/"),否则不变;
当 noclose = 0时,标准输入、标准输出和错误输出重导向为/dev/null,也就是不输出任何信 息,否则照样输出。

返回值:
deamon()调用了fork(),如果fork成功,那么父进程就调用_exit(0)退出,所以看到的错误信息 全部是子进程产生的。如果成功函数返回0,否则返回-1并设置errno。

函数源代码(glibc-2.17):

点击(此处)折叠或打开

  1. int
  2. daemon(nochdir, noclose)
  3.     int nochdir, noclose;
  4. {
  5.     int fd;

  6.     switch (__fork()) {  // 创建子进程
  7.     case -1:
  8.         return (-1);
  9.     case 0:
  10.         break;
  11.     default:
  12.         _exit(0);   // 父进程退出
  13.     }

  14.     if (__setsid() == -1)   // 调用setsid()函数
  15.         return (-1);

  16.     if (!nochdir)
  17.         (void)__chdir("/");   // 设置当前工作目录为根目录

  18.     if (!noclose) {
  19.         struct stat64 st;
  20.         /* 打开/dev/null 设备,并检查是不是字符设备及设备号 */
  21.         if ((fd = open_not_cancel(_PATH_DEVNULL, O_RDWR, 0)) != -1
  22.          && (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0)
  23.             == 0)) {
  24.             if (__builtin_expect (S_ISCHR (st.st_mode), 1) != 0
  25. #if defined DEV_NULL_MAJOR && defined DEV_NULL_MINOR
  26.              && (st.st_rdev
  27.                 == makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR))
  28. #endif
  29.              ) {
  30.                 // 重定向输入、输出、错误描述符到/dev/null
  31.                 (void)__dup2(fd, STDIN_FILENO);
  32.                 (void)__dup2(fd, STDOUT_FILENO);
  33.                 (void)__dup2(fd, STDERR_FILENO);
  34.                 if (fd > 2)
  35.                     (void)__close (fd);
  36.             } else {
  37.                 /* We must set an errno value since no
  38.                  function call actually failed. */
  39.                 close_not_cancel_no_status (fd);  // 关闭fd
  40.                 __set_errno (ENODEV);   // 错误则设置errno
  41.                 return -1;
  42.             }
  43.         } else {
  44.             close_not_cancel_no_status (fd);// 关闭fd
  45.             return -1;
  46.         }
  47.     }
  48.     return (0);
  49. }
使用:

点击(此处)折叠或打开

  1. #include <unsitd.h>

  2. int main()
  3. {
  4.     daemon(0, 0)//参数根据需求确定
  5.     /* 业务处理流程 */
  6. }
程序编写完成后,可以通过shell命令进行启动、停止、重启等操作。类似于vsftpd的管理,下面将介绍如何通过shell进行服务的管理。
阅读(3298) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~