需要澄清有关使用vfork的信息

时间:2015-05-15 05:21:29

标签: c linux fork posix vfork

我想比父进程更早地运行子进程。我只是想从子进程使用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变量)。

2 个答案:

答案 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 失败的原因。