守护进程
什么是守护进程?
守护进程也叫做精灵进程,是运行在后台的特殊进程。独立于控制终端并且周期地执行某种任务或者等待处理某些发生的时间。Linux的大多数服务器是守护进程来实现的。比如ftp服务器、web服务器、ssh服务器等。
Linux系统启动时会启动很多的系统服务进程,这些系统服务进程没有控制终端,不能直接和用户来交互。其它的进程都是在用户登录或者运行程序时创建,在运行结束或者用户注销时终止。**系统服务进程也就是守护进程不受用户的登录注销影响,而是一直在运行着。**它们这些默默运行的进程称为守护进程。这样是不是很形象呢?
可以用ps axj命令来查看系统中的进程。
ps axj | more
- 在TPGID写着-1的都是没有控制终端的进程,也就是守护进程
- 在COMMAND一列用[]的名字表示内核线程,这些线程在内核里面创建,没有用户空间代码,因此没有程序文件名和命令行,通常采用k开头的名称表示内核,kernel
- udevd负责维护/dev目录下的设备文件,acpid负责电源管理,syslogd负责维护/var/log下的日志文件
- 守护进程通常是以d结尾的名字,表示Daemon
创建守护进程
创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并称为Session Leader。
#include<unistd.h>
pid_t setsid(void); //函数成功返回新创建的Session的id,出错返回-1
调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1.要保证当前进程不是进程组的Leader只要先fork再调用setsid即可。fork创建的子进程和父进程在同一个进程组中,进程组的Leader必然是该组进程的第一个进程,所以子进程不可能是该组的第一个进程,在子进程中调用setsid就不会有问题了。
成功调用该函数的结果是:
- 创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id
- 创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id
- 如果当前进程原本又一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。