曲径通幽论坛

标题: getpgid()/getpgrp() -- 取得进程组ID [打印本页]

作者: beyes    时间: 2011-12-31 12:23
标题: getpgid()/getpgrp() -- 取得进程组ID
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





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2