守护进程

守护进程

在介绍守护进程之前应该先了解进程组、作业、会话和终端的概念。
1、进程组:一个或多个进程的集合。每个进程除了有一个进程ID外还属于一个进程组。每个进程组有一个组长进程,组长进程ID即为进程组ID,组长进程可以创建一个进程组,只要有一个进程存在则进程组就存在,与组长进程存不存在无关。
2、作业:Shell分前后台控制的不是进程而是作业或者进程组。一个前、后台作业可以有多个进程组成。
作业控制:shell可以运行一个前台作业和多个后台作业。如果作业中的某进程又创建了子进程,则子进程不属于该作业。如果作业运行结束,而前台进程还在运行,shell就将自己提到前台,原来的前台进程自动变为后台进程组。
3、会话:一个或多个进程组的集合,一个会话中包含会话首进程(控制进程)、一个前台进程组和任意多个后台进程组。一个会话可以有一个控制终端。
4、终端:在UNIX系统中,用户通过终端登录系统后得到一个shell进程,这个终端称为Shell进程的控制终端,控制终端是保存在PCB中的信息,因为fork()会复制PCB中信息,所以有Shell进程启动的进程的控制终端也是这个终端。默认情况下,每个进程的标准输入、标准输出和标准错误输出都指向控制终端。
每个进程都可以通过一个特殊的设备文件dev/tty访问他的控制终端
下面看一下不同的终端所对应的设备文件:



5、守护进程(Daemon)
守护进程也称为精灵进程,是运行在后台的一种特殊进程,也是孤儿进程。它独立与控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是自成会话、自成进程组,不受用户登录及注销的影响,且一直运行,也不需要与用户交互。
创建守护进程:
(1)调用umask将文件模式创建屏蔽字设为0,即umask(0);
(2)调用fork,退出父进程,原因:如果该守护进程是作为一条简单的shell命令启动的,父进程终止使shell认为该命令已经执行完毕,且保证子进程不是一个进程组的组长进程;
(3)调用setsid创建一个新会话,使调用进程成为新会话的首进程,且没有控制终端;
(4)使用chdir将工作目录改为根目录,chdir("/");
(5)关闭不再需要的文件描述符,close(0)或 将文件描述符0,1,2重定向进/dev/null(/dev/null:写入这里面的信息都将被丢弃);
(6)忽略SIGCHLD信号,signal(SIGCHLD,SIG_IGN或SIG_DFL)。
注:有时候创建进程是可以fork两次,因为这样可以保证守护进程之后不会打开tty设备。
创建守护进程代码:












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值