Chinaunix首页 | 论坛 | 博客
  • 博客访问: 693249
  • 博文数量: 90
  • 博客积分: 3225
  • 博客等级: 少校
  • 技术积分: 1200
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-20 11:04
个人简介

菩提本无树,明镜变非台 本来无一物,何处惹尘埃

文章分类

全部博文(90)

文章存档

2015年(1)

2014年(12)

2013年(15)

2012年(31)

2011年(8)

2010年(23)

分类: LINUX

2012-10-23 14:52:44

概述

  守护进程,即系统服务进程,这些进程没有控制终端,也不能直接和用户交互,更不会受用户登陆或注销影响,是一直运行于系统后台中的服务进程。


查看守护进程

  通过"ps axj"命令查看进程(图2.1),其中参数"a"表示所有进程,包括系统进程和用户进程;参数"x"表示不仅列有控制终端的进程,也列出所有无控制终端的进程;参数"j"表示列出与作业控制相关的信息。

2.1

在图中的"TPGID"列中,凡是值为"-1"的进程都是守护进程,其中在"COMMAND"列中用"[ ]"括起来的名字表示内核线程。


3 在用户空间创建守护进程

 3.1 创建步骤:

  A 确保当前进程不是进程组的Leader

  B 重新创建当前进程的新Session

  C 将当前工作目录切换到根目录

  D 将文件描述符012重定向到"/dev/null"

 3.2 实现方法

  实现方法有两种:

  第一种: 在主进程中fork出一个子进程

           B 父进程退出

           C 子进程调用"setsid()"创建新的Session,成为守护进程

           D 调用"chdir()"函数将当前目录切换到根目录

           E 调用"open()""dup2()"将文件描述符012重定向到"/dev/null"

  第二种: 直接调用"daemon()"函数即可

 3.3 示例代码

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. #include <stdlib.h>

  5. void daemonize(void)
  6. {
  7.     pid_t pid;
  8.     pid = fork();
  9.     if( pid < 0 )
  10.     {
  11.         perror("Failed: fork()\n");
  12.         exit(1);
  13.     }
  14.     else if( pid > 0 )
  15.         exit(0);

  16.     setsid();

  17.     if( chdir("/") < 0 )
  18.     {
  19.         perror("Failed:chdir\n");
  20.         exit(1);
  21.     }
  22.    
  23.     /*重定向文件描述符0,1,2到"/dev/null"*/
  24.     close(0);
  25.     open("/dev/null",O_RDWR);
  26.     dup2(0,1);
  27.     dup2(0,2);
  28. }

  29. int main(void)
  30. {
  31. //    daemonize();
  32.     daemon(0,0);
  33.     while(1);
  34. }


阅读(1306) | 评论(0) | 转发(0) |
0

上一篇:socket的输入输出

下一篇:Qt模态与非模态

给主人留下些什么吧!~~