Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1427890
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: 系统运维

2012-05-14 15:18:15



一个会话是一个或多个进程组的集合。比如,我们有下面的布局:会话包含三个进程组,第一个进程组包含登录外壳;第二个进程组包含进程proc1和proc2;第三个进程组包含进程proc3、proc4、proc5。


在一个进程组里的进程通常通过管道被放置在那。例如,上面的布局可能由下面形式的外壳命令产生:
proc1 | proc2 &
proc3 | proc4 | proc 5


一个进程通过调用setsid函数来建立一个新的会话。



  1. #include <unistd.h>

  2. pid_t setsid(void);

  3. 成功返回进程组ID;错误返回-1


如果调用进程不是一个进程组长,那么这个函数创建一个新的会话。有三件事发生:


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靠拢。这两者等价,既然会话领导一直是进程组长。



  1. #include <unistd.h>

  2. pid_t getsid(pid_t pid);

  3. 成功返回会话领导的进程组ID,错误返回-1


如果pid为0,getsid返回调用进程的会话领导的进程组ID。由于安全原因,一些实现可能限制调用进程不能得到会话领导的进程组ID,如果pid不属于和调用者相同的会话。

阅读(399) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~