您的位置:首页 > 产品设计 > UI/UE

APUE守护进程

2014-04-30 18:24 381 查看
pag341

守护进程也称精灵进程,时生存期较长的一种进程。他们常常在系统自举时启动,仅在系统关闭时终止。因为没有控制终端,所以说他们时咋后台运行的。

父进程为0的各进程通常是内核进程,他们作为系统自举过程的一部分而启动。(init是此种进程的例外他是内核在自举时启动的用户层命令)

大多数守护进程都以超级用户(用户ID为0)特权运行。没有一个守护进程具有控制终端,其终端名设置为问号(?),终端前台进程组ID设置为-1。所有用户层守护进程都是进程组的组长进程以及会话的首进程,而且是这些进程组和会话中的唯一进程。大多数守护进程的父进程时init进程。

pag342

守护进程编程规则:

1、调用umask将文件模式创建屏蔽字设置为0。

2、调用fork,然后使父进程退出(exit)。(保证了子进程不是一个进程组组长进程)

3、调用setsid创建一个新会话。(使调用进程:a,成为新会话的首进程;b,成为一个新进程组的组长进程;c,没有控制终端)

(再次调用fork,避免无意中获得新的控制终端)(当没有控制终端的一个会话首进程打开一个终端设备时(不是其他会话的控制终端)该终端自动成为这个会话首进程的控制终端,再次调用fork确保新进程不再是会话首进程,从而不能自动获得一个控制终端)

会话首进程终止时会产生SIGHUP信号,所以要先忽略

4、将当前工作目录改为根目录。

5、关闭不再需要的文件描述符。

6、某些守护进程打开/dev/null使其具有文件描述符0、1、2,这样任何一个试图读标准输入、写标准输出或标准出错的库例程都不会产生任何效果。

pag346

void openlog( const char *ident, intoption, int facility );

void syslog( int priority, const char*format, ...);//产生日志信息

void closelog( void );

int setlogmask( int maskpri);//设置进程的记录优先级屏蔽字

openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。closelog也是可选择的。

单实例守护进程:不允许相同程序以守护进程的形式在同一时间运行多次(可使用文件和记录锁)

守护进程的惯例:

1、守护进程使用锁文件,那么该文件通常存放在/var/run目录中。(name.pid)

2、若守护进程支持配置选项,那么配置文件通常存放在/etc目录中。(name.conf)

3、守护进程可用命令行启动,但通常他们是由系统初始化脚本之一(/etc/rc* 或 /etc/init.d/*)启动的

4、若守护进程有一配置文件,那么当守护进程启动时,他读该文件,但在此之后一般就不会查看他。若一管理员更改了配置文件,那么该守护进程可能需要被停止,然后再启动,以使配置文件的更改生效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: