一.进程间关系
1.进程组
进程组就是一个或多个进程的集合,它们与同一作业相关联,可以接收来自同一终端的各种信号,每个进程组有一个唯一的组id,每个进程组都可以有一个组长id,组长进程的标识是:其进程组id等于其进程id,组。组长进程可以创建一个进程组,创建该组中的进程,然后终止,
注:只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关
&:表示将进程组放在后台执行
ps选项:
- a: 不仅列当前用户的进程,也可列出所有其他用户的进程
- x: 表示不仅列出有控制终端的进程,也列出所有无控制终端的进程
- j: 表示列出与作业控制相关的信息
Shell分前后台控制的不是进程而是作业或者进程组。一个前台作业可以由多个进程组成,一个后台也可以由多个进程组成,Shell可以运行一个前台作业和任意多个后台作业,这称为作业控制。一旦作业运行结束,Shell就把自己提到前台。
作业与进程组的区别是:如果作业中的某个进程又创建了子进程,则子进程不属于作业
3.会话
会话是一个或多个进程组的集合,一个会话可以有多个控制终端,这通常是登录到其上的终端设备(在终端登录情况下)或伪终端设备(在网络登录情况下)。建立与控制终端连接的会话首进程被称为控制进程(bash),一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制进程,一个前台进程组和任意后台进程组
注:登录一个终端是创建一个会话的过程,注销是删除会话的过程
4.作业控制
后台作业禁止从终端读取数据,因为后台作业可能会有多个,不知道讲数据给谁,所以将cat放到后台运行后,由于需要读标准输入(终端输入),因此内核发SIGIIIN信号给cat进程,该进程的默认动作是使进程停止
相关控制信号:
- jobs: 查看所有作业
- fg 1: 提到前台运行。如果该作业的进程组正在后台运行,则提至前台运行,如果该作业处于停止状态,则给进程组的每个进程发送SIGCOUT信号使他继续运行
- bg 1:运行后台作业。使某个停止的作业在后台继续运行,也需要给进程组的每个进程发送SIGCOUT信号
- ctrl+z: 提到后台
二.守护进程
1,基本概念
守护进程也陈精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件,守护进程与终端无关,并且不受用户登录的影响,一般都是以d结尾
注:大部分守护进程是孤儿进程,自成进程组,自成会话
- 这里凡是TPGID一栏写着-1的都是么有控制终端的进程,也就是守护进程
- 在COMMAND一列用【】括起来的标示内核线程
#include <unistd.h>
pid_t setsid(void);
//该函数调用成功时返回新创建的Session的id(其实特就是当前进程的id),出错返回-1
注意:调用这个函数之前,当前进程不能是进程组的Leader,否则该函数返回-1
运行结果为;