我想在父进程之前运行子进程。我只想使用来自子进程的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/

10-11 19:44