在下面显示的一种特殊情况下,getpid()
对于使用创建的孙子vfork()
进程返回父进程的 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
任何线索为什么?这是未定义的行为案例之一吗?
使用ps
和strace
,我可以看到正确的 PID。顺便说一句,相同的示例代码适用于fork()
,即无论是否正确getpid()
,都可以正常工作-lpthread
。