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

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: 系统运维

2012-05-14 15:19:45



除了进程ID,每个进程同样属于一个进程组。我们将在第10章讨论信号时再次碰到进程组。


一个进程组是一个或多个进程的集合,通过和 相同的工作联系起来(工作控制在9.8节讨论),它们可以从相同的终端获取信号。每个进程组有一个唯一的进程组ID。进程组ID和进程ID相似:它们是正 的整型,并以pid_t类型存储。函数getpgrp返回调用进程的进程组ID。



  1. #include <unistd.h>

  2. pid_t getpgrp(void);

  3. 返回调用进程的进程组ID。


在BSD后代系统的早期版本,getpgrp函数接受一个pid参数并返回这个进程的进程组。SUS定义getpgid函数作为一个XSI扩展来效仿这种行为。



  1. #include <unistd.h>

  2. pid_t getpgid(pid_t pid);

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


如果pid为0,返回调用进程的进程组ID。因而getpgid(0)等价于getpgrp();


每个进程组可以有一个进程组长。这个组长和它的进程组ID相等的进程ID于来标识。


可能一个进程组长会创建一个进程组、创建这个组的进程,然后终止。只要至少有一个进程在这个组里,这个进程组便仍然存在,不管进程组长是否终止。这被称为进程组生命周期--由组被创建开始到最后一个进程离开组为止的时间期。组里最后的进程可以终止或进入一些其它的进程组。


一个进程加入一个存在的进程组或创建一个新的进程组,通过调用setpgid。(在下节,我们将看到setsid同样创建一个新的进程组。)



  1. #include <unistd.h>

  2. int setpgid(pid_t pid, pid_t pgid);

  3. 成功返回0,错误返回-1


这个函数设置进程ID为pid的进程的进程组ID为pgid。如果两个参数相同,这个由pid指定的进程成为进程组长。如果pid为0,那么调用者的进程ID被使用。同样,如果pgid为0,由pid指定的进程ID作为进程组ID被使用。


一个进程可以设置它自己的或者它任一子进程的进程组ID。然而,它不能在子进程调用某个exec函数后改变这个子进程的进程组ID。


在 多数工作控制外壳里,这个函数在一个fork后被调用来让父进程设置子进程的组ID,以及让子进程设置它自己的进程组ID。这些调用中有一个是多余的,但 是通过调用两者,在父或子进程假定它已经发生前,我们被保证子进程被安置在它自己的进程组里。如果我们不这样做,我们会有一个竞争条件,因为子进程的进程 组成员可能取决于哪个进程先执行。


当我们讨论信号时,我们将看到我们怎么发送一个信号给单一进程(由它的进程ID指定),或一个进程组(由它的进程组ID指定)。类似地,8.6节的waitpid函数让我们等待单一进程或一个指定进程给的一个进程。

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