getpgid() 和 getpgrp() 的原型如下:
[C++] 纯文本查看 复制代码 #include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
pid_t getpgid(pid_t pid);
每个进程除了有自己的一个进程ID外,它还属于一个进程组。这就如同社会上的人,它不是孤立的,在家庭里他是这个家庭的成员,在单位里他则是该单位的员工,而进程也有自己所属的组 -- 进程组。进程组是一个或多个进程的集合,通常它与同一个作业相关联,可以接收来自同一个终端的各种信号。每个进程组有一个唯一的进程组ID,该 ID 值也是 pid_t 类型,它的子进程将继承父进程的进程组 ID。获取调用进程的进程组 ID 可以使用 getpgrp() 函数,如下代码所示:
[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <unistd.h>
int main()
{
printf ("my group id is %d\n", getpgrp());
return 0;
}
运行输出:./getpgrp
my group id is 6102
如果 getpgrp() 的返回值和调用进程的 PID 相同,那么该进程是该进程组的组长。比如,一般情况下,运行一个普通程序时,它的 PID 实际上就是组长 ID,因为它在运行时就会建立自己的进程组,比如:
[C++] 纯文本查看 复制代码 #include <stdio.h>
#include <unistd.h>
int main()
{
printf ("-----------%d\n", getpgrp());
int i = 10;
while (i > 0) {
printf ("wait a minute...\n");
sleep (3);
i--;
}
return 0;
}
运行该段程序时,一开始就会打印出进程组的 ID,如:$ ./getpgrp
-----------2341
wait a minute...
wait a minute...
... ... 在一个新开的终端窗口里观察该进程的 PID ,那么会发现其值和组长 ID 是一样的,因为它本身就是组长。
getpgid() 函数用来取得参数 pid 指定的进程所属的组的组ID,当 pid 取 0 时,那么就获得当前进程自己的组ID,此时函数行为等同于 getpgrp() ,如下所示:
[C++] 纯文本查看 复制代码 #include <stdio.h>
#include <unistd.h>
int main()
{
printf ("init gid = %d\n", getpgid(1));
printf ("my gid = %d\n", getpgid(0));
return 0;
}
运行输出:./getpgid
init gid = 1
my gid = 6126 |