gpt4 book ai didi

c - getpgid() 是如何工作的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:41 24 4
gpt4 key购买 nike

我正在尝试获取 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 == pgid 的组长,所以也许您总是在进行相同的测试(在进程组组长上),这就是始终获得与进程的 pid 相同的 pgid。当一个进程成为组长时,内核会为其分配自己的 pid 作为 pgid,因此如果您只 checkin 一个进程,您可能总是得到它。 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

关于c - getpgid() 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35173897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com