我想先于父进程运行子进程。我只想使用子进程中的 execv 调用,所以我使用 vfork 而不是 fork。
但是假设 execv 失败并返回,我想从调用 vfork 的函数中返回非零值。
类似这样的事情,
int start_test()
{
int err = 0;
pid_t pid;
pid = vfork();
if(pid == 0) {
execv(APP, ARGS);
err = -1;
_exit(1);
} else if(pid > 0) {
//Do something else
}
return err;
}
上面的代码是否正确,或者我应该使用其他机制来先于父级运行子级?
在一些链接上,我读到,我们不应该修改通过 vfork 创建的子进程中的任何父资源(我正在修改 err 变量)。
最佳答案
Is above code is proper?
没有。 err
变量已经在子进程的内存中,因此父进程将看不到它的修改。
We should not modify any parent resource in child process created through vfork (I am modifying err variable).
该资源已过时。过去一些 *nix 系统尝试用 fork()
/exec()
对来玩弄花招,但通常这些优化很大程度上会适得其反,导致意想不到的、难以执行的结果。重现问题。这就是为什么 vfork()
被从 recent versions of POSIX 中删除的原因。 .
通常,您可以在支持 vfork() 的现代系统上对 vfork() 做出以下假设:如果子进程执行操作系统意外的操作,则子进程将>从 vfork()
升级到普通 fork()
。
例如,在 Linux 上,fork()
和 vfork()
之间的唯一区别是,在后一种情况下,更多的子数据会被放入 lazy COW 中。数据。其效果是 vfork()
比 fork()
稍快,但如果 child 尝试访问尚未复制的内容,则可能会承受一些额外的性能损失。数据,因为它们尚未从父级复制。 (注意一个微妙的问题:父进程也可以修改数据。这也会触发父子进程之间的 COW 和数据重复。)
I just want to use
execv
call from the child process, So i am usingvfork
instead offork
.
无论 vfork()
与 fork()
的情况如何,处理都应该是等效的:子级应该返回特殊的退出代码,而父级应该执行正常的 >waitpid()
并检查退出状态。
否则,如果您想编写可移植应用程序,请不要使用vfork()
:它不是 the POSIX standard 的一部分.
附注This article可能也会感兴趣。如果您仍然想使用 vfork()
,请阅读此 scary official manpage .
关于c - 需要澄清有关 vfork 使用的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30252017/