-1

当我运行以下代码时

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
    pid_t pid;
    pid = vfork();
    printf("hello world\n");
}
Output:
hello world
hello world
hello world
Segmentation fault

我知道除非调用 exec() 或 _exit() ,否则如果我们尝试修改任何变量,vfork() 可能会以奇怪的方式表现,但有人可以解释一下到底发生了什么吗?为什么 hello world 被打印了 3 次?是因为 printf() 正在缓冲吗?最后为什么当父母试图返回时会发生段错误?

4

2 回答 2

1

(来自 POSIX.1) vfork() 函数与 fork(2) 具有相同的效果,除了如果 vfork() 创建的进程修改了用于存储从 vfork() 返回值,或从调用 vfork() 的函数返回,或在成功调用 _exit(2) 或 exec(3) 系列函数之一之前调用任何其他函数。

似乎您违反了使用 vfork 的所有条件。那么它就不起作用了。

于 2016-08-05T17:14:31.117 回答
0

我写的这段代码是一场灾难,并且会以未定义的方式运行,但对这种行为的合理解释可能是:-

由于地址空间是共享的,并且当子进程不是通过_exit()or返回时exec(),因此将执行 I/O 缓冲区的刷新(这会导致额外的 hello world 语句),并且在释放内存的清理过程中printf(),它可能将函数调用放在堆栈框架上,而父级仍然卡住。返回父级时,堆栈上可能没有任何返回地址可以返回给任何人,这会导致分段错误。

于 2016-08-06T05:11:05.537 回答