守护进程

一、基本概念

守护进程也称为精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待某些发生的事件。

和其他后台进程所不同的是,它始终独立其他会话,自成会话组,不受系统登录和注销的影响,一般都是7*24小时在后台运行的。

Linux的大多数服务器就是用守护进程实现的。例如:Internet服务器inetdWeb服务器httpd等。

Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其他进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着。这种进程有一个名称叫守护进程。

守护进程通常用以d结尾的名字,表示Daemon


查看系统中的进程:利用ps axj命令。

参数a表示不仅列出当前用户的进程,也列出所有其他用户的进程;

参数x表示不仅列出控制终端的进程,也列出所有无控制终端的进程;

参数j表示列出与作业控制相关的信息。

 

创建守护进程的步骤:

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

2)调用fork,父进程退出(exit)

3)调用setsid创建一个新会话。

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

5)关闭不在需要的文件描述符。

6)其他:忽略SIGCHLD信号。


创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader

#include <unistd.h>

pid_t setsid(void)

返回值:

成功返回新创建的Sessionid(即当前进程的id);

失败返回-1

注:调用这个函数之前,当前进程不允许是进程组的组长,否则返回-1

保证当前进程不是进程组的组长的方法是:先fork,再调用setsidfork创建的子进程和父进程在同一个进程组中,进程组的组长必然是改组的第一个进程,所以子进程不可能是改组的第一个进程,在子进程中调用setsid就不会有问题。

成功调用该函数的结果是:

1.创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Sessionid

2.创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id

3.如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。所谓失去控制终端,原来的控制终端仍然是打开的,仍然可以读写,但只是一个普通的打开文件而不是控制终端了。

二、编写一个mydaemon.c





三、创建守护进程时fork一次和两次的比较

第一次fork的作用:是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面的setsid服务,调用setsid函数的进程不能是进程组组长,如果不fork出子进程,则此时的父进程是进程组组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。

第二次fork的作用:虽然当前关闭了和控制终端的联系,但是后期可能会误操作打开了终端,只有会话首进程能打开终端设备,也就是需要在fork一次,再把父进程退出,再次fork的子进程作为守护进程继续运行,保证了该守护进程不是对话期的首进程。

二次fork:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值