守护进程的特征
守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daemon的意思)。
由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才退出。如果想让某个进程不因为用户或终端或其他地变化而受到影响,那么就必须把这个进程变成一个守护进程。
守护进程的创建
在创建守护进程程序时需遵循一些基本规则,以便防止产生并不需要的交互作用。
1)首先要做的是调用umask将文件模式创建屏蔽字设置为0。由继承得来的文件模式创建屏蔽字可能会拒绝设置某些权限。
2)调用fork,然后使父进程退出(exit)。这样做实现了下面几点:第一,如果该守护进程时作为一条简单shell命令启动的,那么父进程终止使得shell认为这条命令已经执行完毕;第二,子进程继承了父进程的进程组ID,但具有一个新的进程ID,这就保证了子进程不是一个进程组的组长进程。(这对于下面要做的setsid调用是必要的前提条件)
3)调用setsid创建一个新会话,使调用进程:成为新会话的首进程;成为一个新进程组的组长进程;没有控制终端
4)将当前工作目录更改为根目录。从父进程处继承过来的当前工作目录可能在一个装配文件系统中,如果守护进程工作在这样的文件系统中,那么该文件系统就不能被卸载。
5)关闭不再需要的文件描述符。这使守护进程不再持有从其父进程继承来的某些文件描述符。
6)某些守护进程打开/dev/null使其具有文件描述符0、1和2,这样,任何一个试图读标准输入、写标准输出或标准出错的库例程都不会产生任何效果。
按照这样的步骤就能够创建出系统中的守护进程daemon
需要注意的问题:
守护进程退出处理
因为守护进程往往在系统启动时开始运行,系统退出时退出运行,因此当用户需要外部停止守护进程运行时,往往会使用 kill命令停止该守护进程。所以,守护进程中需要编码来实现kill发出的signal信号处理,达到进程的正常退出。
与守护进程有关的另一个问题就是如何处理出错消息,因为它没有控制终端,所以不能只是简单的写到标准出错上。
在Linux系统中才有syslog实施守护进程的日志统计,该设施的接口是syslog函数,包括
openlog,syslog,closelog,setlogmak等函数,其中openlog与closelog是可选的,调用syslog产生一个日志消息,消息可在/var/log/message中查看。
阅读(898) | 评论(0) | 转发(0) |