APUE 13 守护进程

        很多进程是从系统启动就开始运行,一直运行到系统关闭。对于有这种特殊需求的进程,就给它取了个名字,叫守护进程。由于守护进行是一直运行的,为了防止它中途受到干扰,就把它的控制终端去掉了。但把控制终端去掉之后,守护进程要输出东西怎么办?只能把要输出的内容写到文件里了。但是守护进程A在B目录下的文件C写,守护进程D在E目录下F文件写,系统那么多守护进程,要查找某个守护进程的输出记录就很麻烦。于是用syslog将它们统一起来。

        有些进程只允许它的一个实例运行。举个例子说,如果一个系统里有两个进程调度器,调度器A调度进程C运行,调度器B调度进程D运行,就乱套了。创建单实例进程的方法是,创建一个文件和写锁。那么当一个实例运行后,另一个实例要运行的时候,创建写锁就会失败。

        守护进程通常由系统启动。守护进程如果有配置文件的话,通常只在这个守护进程启动的时候读这个文件。这就是为什么一般设置完配置文件之后,要restart一下守护进程。

        服务器进程中通常调用fork()然后exec()向客户端提供服务。但是服务器进程可能打开了很多文件描述符,而子程序可能用不到这些文件描述符,所以可以在服务器进程中将这些子程序不需要的文件描述符设置为FD_CLOEXE。

问题:为什么创建守护进程需要两个fork()?

        由于守护进程需要分离控制终端,所以需要setsid()。由于setsid()创建新会话并且使非进程组组长进程成为领头进程,所以需要一个非进程组组长进程,于是需要第一个fork().假设产生一个子进程A。它是会话的首进程。由于没有与控制终端连接的会话首进程打开终端设备时,如果这个终端设备不是其他会话的控制终端,该终端设备将自动成为这个会话的控制终端。为了防止这种情况出现,需要将子进程A变为会话的非首进程,于是需要第二个fork()。fork()子进程继承父进程的进程组id,会话id。

你可能感兴趣的:(APUE 13 守护进程)