以在shell中执行程序为例子,介绍了进程相关的概念:process group, controlling
terminals和session
process group(进程组)
我们知道每个进程有唯一的ID,除此之外,每个线程还属于一个唯一的进程组。
一个进程组包含多个进程,其中一个进程被称为进程组领导(process group leader)
进程组也有唯一的ID,这个id就等于领导进程的ID
讲进程组的重要性质前,先要讲一下终端(terminal)的概念。在有GUI界面前,我们
是通过终端和计算机交互,键盘和鼠标的输入都通过终端传递个计算机。
进程组的重要性质是同一进程组内的进程能够接收来自同一个终端的信号。
session(进程会话)和Controlling Terminal(控制终端)
多个进程组成一个进程组,多个进程组组成进程会话(session)
创建会话的进程自动成为进程领导(session leader)
一个会话可以关联一个控制终端(controlling terminal),进程领导将会话与控制终端
关联,进程领导也被称为控制进程(controlling process)
如果一个会话关联了一个控制终端,那么会话内的进程组可以分为两类:前台进程组和
后台进程组。
前台进程组只有一个,可以接收控制终端的输入,并向终端输出信息。
其他进程组都是后台进程组
例子(Linux下Bash shell环境)
- 一般情况下在bash下执行程序
[song@miPad unix]$ ps -o pid,ppid,pgid,sid,tpgid,comm
PID PPID PGID SID TPGID COMMAND
207187 2286 207187 207187 334140 bash
331481 331480 331481 207187 334140 bash
334140 331481 334140 207187 334140 ps
ps
的父进程是331481,但ps
是单独的进程组且为前台进程组,因为TPGID
等于334140
是ps
的进程组id,剩下的两个进程组都是后台进程
- bash下执行程序,且将应用程序放入后台执行
ng@miPad unix]$ ps -o pid,ppid,pgid,sid,tpgid,comm&
[1] 334225
PID PPID PGID SID TPGID COMMAND
207187 2286 207187 207187 331481 bash
331481 331480 331481 207187 331481 bash
334225 331481 334225 207187 331481 ps
这一次,ps
仍然是单独的进程组,但已经不是前台进程组了,前台进程组是bash
进程组331481
- 包含管道的情况
[song@miPad unix]$ ps -o pid,ppid,pgid,sid,tpgid,comm | cat
PID PPID PGID SID TPGID COMMAND
207187 2286 207187 207187 334458 bash
331481 331480 331481 207187 334458 bash
334458 331481 334458 207187 334458 ps
334459 331481 334458 207187 334458 cat
ps
和cat
的父进程都是bash
进程,而且两者同时属于一个前台进程组