守护进程

来源:互联网 发布:unity3d 就业 编辑:程序博客网 时间:2024/05/09 09:12

一、概念

守护进程(又称精灵进程)是脱离于终端,并且在后台运行的进程。

特点:
1. 一般是一直在服务器上执行;
2. 守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断,无控制终端,而且不许需要和用户交互,只需要处理任务;
3. 而且守护进程不受客户端的登录与退出的影响,因为其自成会话,自成进程组;

二、创建

API:
pid_t setsid(void);
(1)该函数成功则返回这个新创建的Session的ID,失败返回-1
(2)不允许一个进程组的组长进程调用这个函数,因为成功调用这个函数会带来3个结果
如果创建的是一个进程组,那么这个进程成为组长
如果创建的是一个会话,那么这个进程成为话首进程
如果当前进程有一个控制终端,那么这个进程会脱离终端,成为一个没有终端的进程
创建分为七步:

  1. 调用umask(0)将权限置0,
  2. 调用fork(),并且将父进程退出,原因是为了防止父进程执行完后shell以为进程执行完,将所有作业撤销
  3. 子进程调用setsid();有时候会在这里再次fork,这是因为上述(2)中所说,如果这个进程是护手进程,那么它拥有打开tty设备的权限,fork第二次主要目的是防止进程再次 打开一个控制终端。因为打开一个控制终端的前台条件是该进程必须是会话组长。再fork一次,子进程ID != sid(sid是进程父进程的sid)。所以也无法打开新的控制终端。
  4. 调用chdir()更改工作目录为主工作目录,更改工作目录为根目录的原因,为防止在用户目录下的文件被相关操作删除
  5. 关闭其不需要的文件描述符
  6. 设置忽略SIGCHLD信号
  7. 设置自己因为收到kill信号而退出的处理函数,因为守护进程是为了执行某个任务,所以在其退出的时候,一般设置处理函数

三、模拟实现

代码如下:
这里写图片描述
运行结果:
这里写图片描述
分析:
这里我们可以看到后台运行了一个deaman进程,而且代码中的printf语句似乎并没有被执行,其实非也,我们在mydemon中关闭了文件描述符0、1、2,所以输出的内容并没有被输出到屏幕,写改代码,屏蔽代码中的close(1),和close(2)语句。再次执行就会看到屏幕上回一直输出改条语句,并且无法通过Ctrl+c、Ctrl+z等终止,然后另开一个终端。通过kill -9 便可以终止这个进程。

原创粉丝点击