apue学习第二十天——守护进程(第十三章)

Daemon!Here arrived!我们之前对其概念已经很熟悉了,这里我们快速通过,本篇可能是最短的一篇。因为不打算细说,并且第十三章的内容本来也很少。


分两块,守护进程的结构,以及如何编写守护进程程序。


1. 守护进程的特征

我们知道,daemon process常常在系统bootstrap时启动,系统terminate时终止。那废话不多说,直接来看一下一些系统守护进程。

输入:> ps -axj

(ps-report a snapshot of the current processes. -a显示process status owned by others; -x 没有控制终端的进程; -j 显示job-related info: session ID, process group ID, controlling terminal, terminal process group ID)

apue学习第二十天——守护进程(第十三章)_第1张图片

结果就类似于这样,看表中,方括号内的都是内核守护进程,比如kthreadd,kswap,flush等等。

PID=1是init进程,主要负责启动各个run levels中的system services,PID=2是kthreadd进程(该linux版本使用此进程来创建其它内核进程),这就是为什么很多PPID=2的原因。

  • kswaped,即pageout daemon,用于过段时间把dirty page写回disk;
  • flush,定期将dirty pages flush到disk;
  • jbd,ext4文件系统中的日志功能;
  • inetd,还记得吗?这是侦听网络服务的守护进程~
  • ……

Notable:所有daemon processes没有controlling terminal,其终端名都为?(见上图)。所有用户层daemon process的父进程为init process。


2. 守护进程的编写规则

书中有详细的示例代码,我就不细看了,这里只列出daemon的编写规则:

(1)调用umask将file mode creation mask设为已知值(通常是0);

(2)调用fork,然后使父进程exit;

(3)调用setsid创建一个新session;

(4)将当前工作目录更改为新目录;

(5)关闭不需要的文件描述符(通常设置close-on-exec位);

(6)某些守护进程attach file descriptors 0, 1, 2 to /dev/null,这样任何一个试图进行standard I/O的library routines都不会产生任何效果。

具体示例见13-1.



你可能感兴趣的:(apue学习第二十天——守护进程(第十三章))