gpt4 book ai didi

c - 使用 vfork() 和 -lpthread 的孙子的 getpid() 结果不正确

转载 作者:行者123 更新时间:2023-12-02 04:27:05 37 4
gpt4 key购买 nike

在如下所示的一种特殊情况下,使用 vfork() 创建的孙进程的 getpid() 返回父进程的 PID。

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

int main() {
if(vfork()) { /* parent */
printf("parent pid = %d\n", getpid());
exit(0);
} else {
if(vfork()) { /* child */
printf("child pid = %d\n", getpid());
exit(0);
} else { /* grandchild */
printf("grandchild pid = %d\n", getpid());
exit(0);
}
}
}

编译为gcc main.c,这按预期工作:

grandchild pid = 12241
child pid = 12240
parent pid = 12239

编译为gcc main.c -lpthread,孙子PID不正确:

grandchild pid = 12431
child pid = 12432
parent pid = 12431

有什么线索吗?这是未定义行为案例之一吗?

使用psstrace,我可以看到正确的PID。顺便说一句,相同的示例代码可以很好地使用 fork(),即使用或不使用 -lpthread 时正确的 getpid()

最佳答案

getpid 不是您在子级中 vfork 之后允许执行的两个操作之一;仅有的两个是 execve_exit。 glibc 会在用户空间中缓存进程的 pid,并且不会在 vfork 上更新此缓存(因为它会修改父进程的缓存值,而且由于有效代码无法观察到结果,因此不需要它) );这就是您所看到的行为的机制。缓存行为与链接的 -lpthread 略有不同。但根本原因是你的代码无效。

差不多,不要使用vfork。您基本上无法用它做任何事情。

关于c - 使用 vfork() 和 -lpthread 的孙子的 getpid() 结果不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60006155/

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