进程
在内核中,每个进程都使用一个不同的大于零的正整数来标识,称为进程号pid(process ID)。
进程组
一个进程可以通过 fork() 调用创建一个或多个子进程,这些进程就可以构成一个进程组。例如,
liyongjun@Box:~$ sleep 100 | sleep 200 | sleep 300
$ ps -efj
UID PID PPID PGID SID C STIME TTY TIME CMD
liyongj+ 826811 2322 826811 826811 0 22:29 pts/93 00:00:00 bash
liyongj+ 826822 826811 826822 826811 0 22:29 pts/93 00:00:00 sleep 100
liyongj+ 826823 826811 826822 826811 0 22:29 pts/93 00:00:00 sleep 200
liyongj+ 826824 826811 826822 826811 0 22:29 pts/93 00:00:00 sleep 300
三个 sleep 就同属于一个进程组 PGID = 826822。
进程组是一个或多个进程的集合,与进程类似,每个进程组都有一个唯一的进程组标号 gid(Group ID)。进程组号 gid 也是一个正整数,每一个进程组都有一个称为组长的进程,组长进程就是其进程号 pid 等于进程组号 gid 的进程。
一个进程可以通过调用 setgpid() 来参加一个现有的进程组或者创建一个新的进程组。
进程组的概念有很多用途,其中最常见的是我们在终端上向前台执行程序发出终止信号(Ctrl-C),同时终止整个进程组中的所有进程。例如,如果我们向上述管道命令发出终止信号,则三个命令将同时终止执行。
会话期
会话期(Session,或称为会话)则是一个或多个进程组的集合。通常情况下,用户登录后所执行的所有程序都属于一个会话期,而其登录 shell 则是会话期首进程(Session leader),并且它所使用的终端就是会话期的控制终端(Controlling Terminal),因此会话期首进程通常也被称为控制进程(Controlling Process)。
当我们退出(logout)时,所有属于我们这个会话期的进程都将被终止。这也是会话期概念的主要用途之一。
例如,telnet 登录系统后,通过该会话创建的所有进程,在 telnet 登出或者断开连接时,这些进程都将终止。
进程、进程组、会话期之间的关系
一个终端只能作为一个会话期的控制终端,前台进程组就是会话期中拥有控制终端的一个进程组,而会话期中的其它进程组则称为后台进程组。