Linux进程间的关系详解
Lux的进程相互之间有一定的关系。比如说,在中,我们看到,每个进程都有父进程,而所有的进程以it进程为根,形成一个树状结构。我们在这里讲解进程组和会话,以便以更加丰富的方式了管理进程。
进程组 (process group)
每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程。进程组会有一个进程组领导进程 (process group leader),领导进程的PID (PID见)成为进程组的ID (process group ID, PGID),以识别进程组。
复制代码
$ps -o pid,pgid,ppid,m | cat</p> <p> PID PGID PPID COMMAND
17763 17763 17751 bash
18534 18534 17763 ps
18535 18534 17763 cat
PID为进程自身的ID,PGID为进程所在的进程组的ID, PPID为进程的父进程ID。从上面的结果,我们可以推测出如下关系
图中箭头表示父进程通过产生子进程。ps和cat都是bash的子进程。进程组的领导进程的PID成为进程组ID。领导进程可以先终结。此时进程组依然存在,并持有相同的PGID,直到进程组中一个进程终结。
我们将一些进程归为进程组的一个重要原因是我们可以将发送给一个进程组。进程组中的所有进程都会收到该信号。我们会在下一部分深入讨论这一点。
会话 (session)
更进一步,在shell支持工作控制(job control)的前提下,多个进程组还可以构成一个会话 (session)。bash(Bourne-Aga shell)支持工作控制,而sh(Bourne shell)并不支持。
会话是由其中的进程建立的,该进程叫做会话的领导进程(session leader)。会话领导进程的PID成为识别会话的SID(session ID)。会话中的每个进程组称为一个工作(job)。会话可以有一个进程组成为会话的前台工作(foreground),而其他的进程组是后台工作(background)。每个会话可以连接一个控制终端(control termal)。当控制终端有输入输出时,都传递给该会话的前台进程组。由终端产生的信号,比如CTRL+Z, CTRL+\,会传递到前台进程组。
会话的意义在于将多个工作囊括在一个终端,并取其中的一个工作作为前台,来直接接收该终端的输入输出以及终端信号。 其他工作在后台运行。
一个命令可以通过在末尾加上&方式让它在后台运行:
复制代码