1.进程间关系与守护进程
1.进程,进程组,会话,终端之间的关系
a) 进程一定在一个进程组之中,一个会话可以包括多个进程组。一个会话对应一个控制终端。
b) 进程组存在理由:有了进程组id,就可以一下子kill一片的进程,方便管理
c) 会话存在的理由:linux是一个多用户多任务的分时操作系统,必须要支持多个用户登录同一个操作系统,当一个用户登录一次终端时就会产生一个会话。每个会话有一个会话首进程,即【创建会话的进程,成为控制进程】,【用来建立与终端的连接】。一个会话中的进程可以分为一个前台进程组和多个后台进程组。前台进程组是指与终端进行交互的进程,后台进程组则是不需要与终端交互的进程组
2.守护进程及其创建
a) 概念:在后台运行,独立于控制终端,并周期性执行某种任务或等待处理某些事件的发生。
b) 创建守护进程目标:一个会话只有守护进程一个,并且创建该会话的控制进程被杀死。
i. 【让进程在后台运行】:fork子进程,kill父进程,运行在后台
ii. 【脱离控制终端】:控制终端、会话、进程组都是从父进程继承下来的,为成为守护进程,需要摆脱它们。调用setsid,使本进程成为新的会话的控制进程和新的进程组的组长,并与原登录会话和进程组脱离。由于会话过程中对控制终端的独占性,处于新会话的进程同时与控制终端脱离了
iii. 【禁止进程重新打开终端】:现在进程已经成为无终端的会话的控制进程。但它仍然可以重新申请打开一个控制终端。通过使进程不在成为控制进程的方式来禁止重新打开控制终端。Fork子进程,kil本进程。这样作为控制进程的本进程死了,作为为控制进程的子进程还活着,这样就永远无法重新打开控制终端了。
iv. 【关闭打开的文件描述符】:关闭从父进程处继承下的文件描述符,以免浪费资源
v. 【改变当前工作目录】:fork函数产生的子进程将继承父进程的当前工作目录。当进程没有结束时,其工作目录是不能被卸载的,所以守护进程的工作目录一般在根目录下。
vi. 【重设文件创建掩码】:进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除:umask(0);守护进程产生的临时文件不是谁都可以访问的。
vii. 【处理SIGCHLD信号】:处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。