全部博文(842)
分类: 系统运维
2012-05-14 15:18:15
一个会话是一个或多个进程组的集合。比如,我们有下面的布局:会话包含三个进程组,第一个进程组包含登录外壳;第二个进程组包含进程proc1和proc2;第三个进程组包含进程proc3、proc4、proc5。
在一个进程组里的进程通常通过管道被放置在那。例如,上面的布局可能由下面形式的外壳命令产生:
proc1 | proc2 &
proc3 | proc4 | proc 5
一个进程通过调用setsid函数来建立一个新的会话。
如果调用进程不是一个进程组长,那么这个函数创建一个新的会话。有三件事发生:
1、进程变为这个新会话的会话领导。(一个会话领导是创建一个会话的进程。)这个进程是这个新会话里的唯一进程。
2、进程变为一个新进程组的进程组长。这个新进程组ID是调用进程的进程ID。
3、进程没有控制终端。(我们将在下节讨论进程终端。)如果进程在调用setsid之前有一个控制终端,那么这个关联被打破。
如 果调用者已经是一个进程组长,那么这个函数返回一个错误。为了保证不是这种情况,通常的做法是调用fork并让父进程终止而让子进程继续。我们被保证这个 子进程不是一个进程组长,因为父进程的进程组ID被子进程继承,但是子进程得到一个新的进程ID。因此,子进程ID不可能和继承下来的进程组ID相同。
USU 只提到“会话领导”。而没有和一个进程ID或进程组ID相似的“会话ID”。显然,一个会话领导是有一个唯一进程ID的单一进程,所以我们可以把会话领导 的进程ID作为会话ID。进程ID的概念在SVR4引入。历史上,基于BSD的系统没有支持这个符号,但是被更新为引入了它。getsid函数返回一个进 程的会话领导的进程组ID。getsid函数是SUS的XSI扩展。
一个实现,比如Solaris,用避免短语“会话ID”而使用“会话领导的进程组ID”来向SUS靠拢。这两者等价,既然会话领导一直是进程组长。
如果pid为0,getsid返回调用进程的会话领导的进程组ID。由于安全原因,一些实现可能限制调用进程不能得到会话领导的进程组ID,如果pid不属于和调用者相同的会话。