我想在父进程之前运行子进程。我只想使用来自子进程的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变量)。
最佳答案
以上代码是否正确?
不,err
变量已经在孩子的内存中,因此家长不会看到它的修改。
我们不应该修改通过vfork创建的子进程中的任何父资源(我正在修改err变量)。
资源已过期。过去,一些*nix系统试图用fork()
/exec()
对来耍花招,但通常情况下,这些优化大多适得其反,导致意外的、难以重现的问题。这就是为什么vfork()
从recent versions of POSIX中删除的原因。
一般来说,您可以在支持它的现代系统上对vfork()
进行这样的假设:如果孩子做了操作系统无法预料的事情,那么孩子将从vfork()
ed升级到正常的fork()
ed。
例如,在linux上,fork()
和vfork()
之间的唯一区别是,在以后的情况下,更多的孩子的数据被转换成lazy COW数据。其结果是vfork()
比fork()
稍快,但如果子级尝试访问尚未复制的数据,则可能会承受一些额外的性能损失,因为它们尚未从父级复制。(注意一个微妙的问题:父级也可以修改数据。这也会触发CoW,并在父进程和子进程之间复制数据。)
我只想使用子进程的execv
调用,所以我使用的是vfork
而不是fork
。
处理应等价于vfork()
vs> cc>:子应该返回一个特殊的退出代码,家长应该做正常的fork()
并检查退出状态。
否则,如果要编写可移植应用程序,请不要使用waitpid()
:它不是the POSIX standard的一部分。
P.S.This article也可能引起兴趣。如果您仍然想使用vfork()
,请阅读此scary official manpage。
关于c - 需要澄清有关vfork的使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30252017/