LINUX守护进程
守护进程也称精灵进程,是运行在后台的一种特殊进程。他独立于控制端并且周期性地执行某种任务或等待处理某些发生的事件。
Linux系统启动时会启动很多的系统服务进程,这些进程没有控制终端,不能直接和用户交互,系统服务进程不受用户登录注销的影响
他们一直都在运行着。
参数a表示列出所有其他用户的进程,参数x表示列出所有有控制终端的和无控制终端的进程,参数j表示列出与作业控制相关的信息
YPGID一栏写着-1的都是没有控制终端的进程,也就是守护进程
1.创建守护进程最关键的一步就是调用setsid函数创建一个新的会话(Session),并成为Session Leader.
#include<unistd.h>
pid_t setsid(void)
setsid函数的作用:
1).子进程成为新会话的首进程
2).子进程成为一个进程组的组长进程
3).子进程没有控制终端
具体可以分为以下几步:
1.umask设置为0.
2.调用fork函数,在将父进程退出。
3.调用setsid函数创建一个新的Session,并成为Session Leader.
4.改变当前目录为根目录
5.关闭当前文件描述符
6.忽略SIGCHLD信号(子进程退出时会发给父进程的信号)
调用setsid函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。这就是fork后将父进程退出的原因。刚创建的子进程不会是进程组的组长、
查看守护进程:
最后需要杀死守护进程 kill -9 8388
上面的代码中fork一次就完成了对守护进程的创建,调用两次fork作用如下:
第一次fork:如果不fork出子进程,则此时的父进程是进程组组长,就无法调用setsid.当子进程调用setsid函数之后,子进程
是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得
进程退出。
第二次fork:
虽然当前关闭了和终端的联系,但是后期可能会误操作打开了终端。
但是只有会话首进程能打开终端设备,所以再fork一次,把父进程退出,再次fork的子进程作为守护进程继续运行,保证了
该精灵进进程不是对话期的首进程,第二次不是必须的是可选的。
小结:
守护进程是Linux中重要的角色,它无控制终端,自成会话,生存周期与用户登录注销无关,常用于常驻内存的网络服务,
Linux提供了一个函数可以直接创建守护进程;
int daemon(int nochdir,int noclose)
使用两个参数都传0即可,代表当前工作目录变更为根目录;关闭文件描述符。相当于文件重定向/dev/null,写入这里的
内容会被操作系统丢弃。