守护进程的特点:(1)linux系统启动时会启动很多系统服务进程,守护进程没有控制终端,不能直接和用户交互(2)其他进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但守护进程不受用户登录注销的影响,只受开机或者关机的影响。
守护进程存在的原因:daemon函数存在的原因是因为控制终端由于某些原因(如断开终端链接)会发送一些信号的原因。而接收处理这些信号的缺省动作会让进程退出。这些信号会由于终端上敲一些特殊按键而产生。
守护进程和后台进程的区别:(1)守护进程是后台进程,后台进程不一定是守护进程(2)守护进程运行是与终端无关的,是不能往终端上打消息的(3)守护进程的会话组和当前目录,文件描述符都是独立的。后台运行只是终端进行了一次fork,让程序在后台执行
创建守护进程:创建守护进程最关键的一步是调用setsid函数创建一个新的session,并成为Session Leader。#include<unistd.h>pid_t setsid(void);该函数调用成功时返回新创建的Session的id(其实也就是当前进程的id),出错返回-1。注意,调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。要保证当前进程不是进程组的Leader也很容易,只要先fork再调用setsid就行了。fork创建的子进程和父进程在同一个进 程组中,进程组的Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程,在子进程中调用setsid就不会有问题了。成功调用该函数的结果是:(1)创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id。(2)创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id。(3)如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。所谓失去控制终端是指,原来的控制终端仍然是打开的,仍然可以读写,但只是一个普通的打开文件而不是控制终端了。创建守护进程的步骤:(1)调用umask将文件模式创建屏蔽字设置为0(2)父进程fork出子进程,然后子进程调用setsid,父进程直接退出(保证了子进程不是一个进程组的组长),(3)调用setsid创建一个新的会话(调用成功会使调用进程成为新会话的首进程,并且成为一个进程组的组长进程,调用进程没有控制终端)(4)将当前工作目录更改为根目录(5)关闭不在需要的文件描述符(6)忽略SIGCHLD信号下面是我写的创建守护进程的代码(fork两次):


新闻热点
疑难解答