C getpgid()是如何工作的?
我正在尝试获取pid、ppid和pgid 无论我做什么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
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