我正在尝试获取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的初学者。
答案 0 :(得分:1)
流程组负责人总是拥有pid == pgid
的人,所以也许你总是做同样的测试(在流程组负责人身上),这就是得到总是相同的pgid
的原因作为流程的pid
。当一个进程成为一个组长时,内核会将它自己的pid
指定为pgid
,所以如果你只检查一个进程,也许你总是得到它。 Bash使用进程组来区分后台作业并执行作业控制,因此您从bash(1)
shell执行的每个命令都将有一个新的进程组,其中一个进程(如果您只启动一个进程,则只有一个进程)将具有与您请求的工作的其中一个流程的pgid
和pid
相同。
这种逻辑的原因(使用进程组负责人的pid作为pgid)是不必处理活动进程组,因为系统中没有更多的组可以在系统中...所以当一个新的需要组ID最近的可用流程是触发新流程组创建的自己的流程,因此将自己的pid
指定为pgid
无害。
举一个简单的例子......只需尝试使用相同的程序,通过管道来演示长管道中的pid
和pgid
值(您应该尝试将输出打印到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);