Chinaunix首页 | 论坛 | 博客
  • 博客访问: 986272
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

2008-11-28 13:55:07

9.4 process groups

Progess group就是将一些进程放到一个group里,这样terminal可以向一个group里的所有进程发送信号。方便管理。一个group里的process一般都是为了完成一个jobForeground process group是指那些占用当前terminalprocess group,也是当前terminal发送signal的接受者。

获取当前进程的组id:

#include

 

pid_t getpgrp(void);

 

Returns: process group ID of calling process

 

获取pid对应的process的组id:

#include

 

pid_t getpgid(pid_t pid);

 

Returns: process group ID if OK, 1 on error

 

每个组里的processprocess group id等于这个组的process leaderpid。而这个process leader可以先行terminate,而这个组及其其他组员依旧保留,直到该组中最后一个组员退出。。 一个process group leader可以建立组,在组中建立process,然后退出。

一个process 通过如下调用可以建立一个group或者让某个process加入一个已经存在的组, 一个进程只可能设置自己或者其子进程的group,如果子进程执行了exec后,就不能再对其组进行设置了.exec会保留process group idsession关系。

设置组时,仅能将组设置成与自己在同一个session的其他的组,不能跨越session

shell里,当执行proc1 | proc2等类似的使用pipeline的命令形式的时候,会产生一个process group,而且shell决定哪个process group会成为foreground process group.从而决定terminal的输出和输入是给那个process的。

#include

 

int setpgid(pid_t pid, pid_t pgid);

 

Returns: 0 if OK, 1 on error

 

一般情况下设置一个进程的组的方法:

1Fork出子进程后在parent里设置其子进程的组id

2. 同样,在子进程里也要设置自己的组id

这样重复的工作的意义: 因为我们不知道fork调用后究竟是父亲先运行还是孩子先运行,所以我们的保证不管谁先运行都要先把孩子的组给设置好。避免由于运行顺序不同造成的程序的结果的不同及race condition

9.5 sessions

1.一个session有多个process group构成。

2.每个session总有一个session leader, 他是一个process, 他同时也是该session内部的一个process groupgroup leader

一个session不一定拥有controlling terminal,比如一个刚通过调用setsid建立的session就没有controlling terminal

3. 如下是建立session的函数:

#include

 

pid_t setsid(void);

 

Returns: process group ID if OK, 1 on error

4.一个process可以在一个session内部的process group之间跳动,但不可跳出一个session

5.一个process group leader 是不能建立新的session的。可以通过让当前process 调用fork,然后父亲退出,有儿子来调用setsid来建立一个 session,可以肯定的是儿子肯定不是一个process group leader.

6.建立了一个新的session后,只有一个process group,一个process。这个session将失去它和controlling terminal的连接。将不再具有controlling terminal

7.如下是获取一个sessionsession leader process id的方法:

#include

 

pid_t getsid(pid_t pid);

 

Returns: session leader's process group ID if OK, 1 on error

但是有些实现仅限于pid为与本processsessionprocess pid。所以我们可以直接调用getsid(0)就可以了,即获取本进程所在sessionsession leaderpid>

8.有controlling terminal和可以使用controlling terminal是不一样的。一个session controlling terminal意味着该session内部的process 们都拥有controlling terminal。但是不一定可以使用。只有处于foregroundprocess group里的process们才可以访问controlling terminal

9.因为一个session不一定拥有controlling terminal,所以,一个session leader也不一定拥有controlling

10.对于一个 拥有controlling terminal session,其session leader不一定一直处于foreground状态。有可能处于background process group状态。比如一个session里的login shell一般都是其session leader,当使用它启动一些命令后,会为将新命令建立新的process group,而这些命令的process group可能就成了foreground process group。虽然他们都有controlling terminnal,但是只有这些命令可以使用当前的controlling terminal

11Shelljob control就具有管理谁是foreground谁不是的功能。

上述这些概念特性可以依据figure 9.12 FreeBSD implementation of sessions and process groups这个图来得到更好的理解。

由图可见,controll terminal对应的结构体tty是被session对应的结构体指向的,所以一个session有了controlling terminal,他的所有的成员就都有了。而在tty结构体里,有一个指针,指向了fore ground process group,所以有了controlling terminal就知道了那个group foregroun了。

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