我想比父进程更早地运行子进程。我只是想从子进程使用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变量)。
答案 0 :(得分:2)
以上代码是否合适?
没有。 err
变量已经存在于子节点内存中,因此父节点不会看到它的修改。
我们不应该修改通过vfork创建的子进程中的任何父资源(我正在修改err变量)。
资源已过时。过去有些* nix系统尝试使用fork()
/ exec()
对进行技巧,但通常这些优化很大程度上适得其反,导致意外的,难以重现的问题。这就是vfork()
从<{3}} 移除的原因。
一般情况下,您可以在支持它的现代系统上对vfork()
做出这样的假设:如果孩子通过操作系统执行某些意外,则该孩子将升级从vfork()
ed到普通fork()
ed。
例如,在Linux上,fork()
和vfork()
之间的唯一区别在于,在以后的情况下,更多的子项数据会被转换为recent versions of POSIX数据。结果是vfork()
稍微快于fork()
,但是如果孩子试图访问尚未复制的数据,那么孩子可能会承受额外的性能损失,因为它们尚未从中复制父母。 (注意细微的问题:父级也可以修改数据。这也会触发COW和父进程和子进程之间的数据重复。)
我只想使用来自子进程的
execv
来电,因此我使用vfork
代替fork
。
无论vfork()
vs fork()
如何,处理都应该是等效的:child应该返回一个特殊的退出代码,而parent应该执行正常的waitpid()
并检查退出状态。< / p>
否则,如果您要编写便携式应用程序,请不使用vfork()
:它不属于lazy COW。
P.S。 the POSIX standard也可能是有趣的。如果您仍想使用vfork()
,请阅读此This article。
答案 1 :(得分:0)
是。您不应该修改变量 err 。在父进程中使用 waitpid 来检查子进程的退出代码。还要检查 execv 和 errno 变量的返回值(请参阅man execv),以确定 execv 失败的原因。