linux 进程组 会话 控制终端

一个进程可以通过fork()调用创建子进程,这些进程就可以构成一个进程组。

进程组

---------------------------------------------

进程组是一个或多个进程的集合。每个进程组有一个称为组长的进程,组长进程就是其进程号(pid)等于进程组号(gid)的进程(即进程组号等于组长的进程号)。进程组的概念有很多用途,最常见的是我们在终端上向前台执行程序发出终止信号(Ctrl-C),同时终止整个进程组的所有进程。

(1).Shell上的一条命令行形成一个进程组

(2).每个进程属于一个进程组

(3).每个进程组有一个领头进程(组长)

(4).进程组的生命周期到组中最后一个进程终止,或加入其他进程组为止

(5).getpgrp:获得进程组id,即领头进程的pid

(6).前台进程组和后台进程组

(7).进程A(假设该进程为组长)和其子进程B属于同一进程组,它们的进程组号(task_struct.gid)都为进程A的进程号(A.pid)

会话

---------------------------------------------

会话期(Session,或者称为会话)则是一个或多个进程组的集合。通常情况下,用户登录后所执行的所有程序都属于一个会话期,而其登录shell则是会话期首进程(Sessionleader),并且它所使用的中断就是会话期的控制终端(ControllingTerminal),因此会话期的首进程通常也被称为控制进程(Controllingprocess)。当我们退出登录(logout)时,所有属于这个会话期的进程都将被终止。

(1).一次登录形成一个会话

(2).一个会话可包含多个进程组,但只能有一个前台进程组.

(3).setsid()可建立一个新的会话;如果调用该函数的进程不是进程组的领头进程,该函数才能建立新的会话.

调用setsid()之后,调用进程将成为新会话的领头进程.

控制终端

---------------------------------------------

(1)会话的领头进程打开一个终端之后,该终端就成为该会话的控制终端(SVR4/Linux)

(2)与控制终端建立连接的会话领头进程称为控制进程(sessionleader)

(3)一个会话只能有一个控制终端

(4)产生在控制终端上的输入和信号将发送给会话的前台进程组中的所有进程

(5)终端上的连接断开时(比如网络断开或Modem断开),挂起信号将发送到控制进程(sessionleader)