getpgid()如何工作?

时间:2016-02-03 10:05:39

标签: c linux

我正在尝试获取pid,ppid和 pgid 无论我做什么getpgid(pid)总是给我pid。

起初,我正在使用它:

 printf("PGID: %d", getpgid());

然后我意识到,getpgid正在拿一个pid作为参数,所以我这样做了:

 printf("PGID: %d", getpgid(getpid()));

但这仍然给我与pid相同的数字......

所以我尝试了这个:

 pid_t pid;  
 pid = getpid(); 
 printf("PGID: %d", getpgid(pid));

这仍然不起作用......知道为什么吗?

PS:我是c的初学者。

3 个答案:

答案 0 :(得分:1)

流程组负责人总是拥有pid == pgid的人,所以也许你总是做同样的测试(在流程组负责人身上),这就是得到总是相同的pgid的原因作为流程的pid。当一个进程成为一个组长时,内核会将它自己的pid指定为pgid,所以如果你只检查一个进程,也许你总是得到它。 Bash使用进程组来区分后台作业并执行作业控制,因此您从bash(1) shell执行的每个命令都将有一个新的进程组,其中一个进程(如果您只启动一个进程,则只有一个进程)将具有与您请求的工作的其中一个流程的pgidpid相同。

这种逻辑的原因(使用进程组负责人的pid作为pgid)是不必处理活动进程组,因为系统中没有更多的组可以在系统中...所以当一个新的需要组ID最近的可用流程是触发新流程组创建的自己的流程,因此将自己的pid指定为pgid无害。

举一个简单的例子......只需尝试使用相同的程序,通过管道来演示长管道中的pidpgid值(您应该尝试将输出打印到stderr而不是stdout或所有输出将在管道中下一个进程的输入缓冲区中丢失:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int pid = getpid();
    fprintf(stderr, "pid=%d; pgid=%d\n", pid, getpgid(pid));
    exit(EXIT_SUCCESS);
}

然后

$ testpgid | testpgid | testpgid
pid=3819; pgid=3819
pid=3820; pgid=3819
pid=3821; pgid=3819
$ testpgid | testpgid | testpgid
pid=3833; pgid=3833
pid=3835; pgid=3833
pid=3834; pgid=3833

答案 1 :(得分:0)

getpid()返回当前进程的进程ID。 当进程正在运行时,内核会调度其运行时 - 特别是它为其分配一个PID - 这些信息存储在内核地址空间内,数据结构中(例如在任务结构内)。 因此,当进程调用getpid()系统调用时,内核只需要查看调用进程的任务结构。

答案 2 :(得分:-2)

它是由pid指定的进程的组ID。

假设我们将pid视为零,则在其中使用当前进程的ID。 getpgrp()getpgid(0)彼此相同。

e.g。 pid_t getpgid(pid_t pid);