C getpgid()是如何工作的?

C getpgid()是如何工作的?,c,linux,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、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的初学者。

它是pid指定的进程的组ID

假设如果将PID作为零,则使用当前进程的ID。code>getpgrp()和
getpgid(0)
彼此等效


e、 g.
pid\u t getpgid(pid\u t pid)

它是pid指定的进程的组ID

假设如果将PID作为零,则使用当前进程的ID。code>getpgrp()
getpgid(0)
彼此等效

e、 g.
pid\u t getpgid(pid\u t pid)

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

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

进程组组长总是具有
pid==pgid
,因此可能您总是在进行相同的测试(在进程组组长上)这就是为什么得到的
pgid
总是与流程的
pid
相同的原因。当一个进程成为组组长时,内核会将它自己的
pid
指定为
pgid
,因此如果您只签入一个进程,那么您可能总是会得到它。Bash使用进程组来区分后台作业和执行作业控制,因此从
Bash(1)
shell执行的每个命令都将有一个新的进程组和其中一个进程(如果只启动一个进程,则只有一个进程)将具有与您请求的作业的一个进程相同的
pgid
pid

此逻辑的原因(使用流程组长的pid作为pgid)是不必处理活动流程组,因为系统中可以处理的组不多。。。因此,当需要一个新的组id时,最近可用的进程是触发新进程组创建的自己的进程,因此将自己的
pid
分配为
pgid
是无害的

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


流程组长总是具有
pid==pgid
,因此您可能总是在进行相同的测试(在流程组长上),这就是为什么总是获得与流程的
pid
相同的
pgid
。当一个进程成为组组长时,内核会将它自己的
pid
指定为
pgid
,因此如果您只签入一个进程,那么您可能总是会得到它。Bash使用进程组来区分后台作业和执行作业控制,因此从
Bash(1)
shell执行的每个命令都将有一个新的进程组和其中一个进程(如果只启动一个进程,则只有一个进程)将具有与您请求的作业的一个进程相同的
pgid
pid

此逻辑的原因(使用流程组长的pid作为pgid)是不必处理活动流程组,因为系统中可以处理的组不多。。。因此,当需要一个新的组id时,最近可用的进程是触发新进程组创建的自己的进程,因此将自己的
pid
分配为
pgid
是无害的

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


它可以工作-shell可能正在将进程组id设置为与进程id相同的id。可能在子进程中执行fork并尝试它。首先尝试描述PID和PGID在什么情况下会不同。然后在重试之前复制它。好的,我尝试了fork,所以这次:对于父进程:pgid与pid相同。。。对于子进程,pgid与ppid相同。。。有时,它只是为ppid打印一个。但我觉得我在过去做了些错事fork@ThomasDupondppid为1表示父进程先于子进程死亡,并且子进程已被init进程采用(PID 1).Minimal runnable
setpgid
getpgid
它们的不同之处:它可以工作-shell可能正在将进程组id设置为与进程id相同。也许可以执行一个fork并在子进程中尝试它。首先尝试描述PID和PGID在什么情况下会不同。然后在重试之前复制它
#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