我正在使用fork/vfork函数,这让我感到困惑。在史蒂文斯书中写道:
所以我尝试测试是否会出现printf错误,在vfork手册中有:
但是当我编译并执行此程序时:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
int s;
pid_t ret;
if (vfork() == 0)
{
//abort();
exit(6);
}
else
{
ret=wait(&s);
printf("termination status to %d\n",s);
if (WIFEXITED(s))
printf("normalnie, status to %d\n",WEXITSTATUS(s));
}
return 0;
}
一切正常,我没有收到任何printf错误。这是为什么?
最佳答案
您引用的段落末尾说:
这很可能正在发生。您的操作系统实际上并没有关闭流(但可能会刷新它)。
重要的不是exit
在这里做什么,而是其基本概念。 child 正在共享父级的内存和堆栈帧。这意味着 child 可以很容易地更改 parent 不希望的事情,这很容易导致 parent 在再次开始运行时崩溃或行为异常。 vfork
的手册页上说,进程唯一可以做的就是调用exit()
或exec
。实际上, child 甚至不应该分配内存或修改任何变量。
要查看其影响,请尝试将vfork
调用放在函数内部,然后让子级在那里返回或修改一些变量,然后看看会发生什么。
关于c - 标准流和vfork,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10036068/