C-需要澄清有关VFORK的使用

  • 本文关键字:VFORK c linux fork posix vfork
  • 更新时间 :
  • 英文 :


我想比父进程更早地运行子进程。我只想使用子过程中的execv调用,所以我使用的是vfork而不是叉子。

但是假设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 variable)。

资源已过时。过去,一些 *NIX系统试图使用fork()/exec()对播放技巧,但通常这些优化在很大程度上是适得其反的,导致出乎意料的,难以复制问题。这就是为什么vfork()已从POSIX的最新版本中删除

通常,您可以在支持它的现代系统上对vfork()做出此假设:如果孩子做意外的,则该孩子将从vfork() ED中升级到正常的fork() ED。

例如,在Linux上,fork()vfork()之间的唯一区别在于,在后来的情况下,更多的孩子的数据被将懒惰的牛数据放入。效果是vfork()fork()稍快,但是如果儿童试图访问尚未引起的数据,则可能会承受一些额外的绩效罚款,因为它们尚未从父母那里复制。(请注意微妙的问题:父母也可以修改数据。这也会触发父母和子进程之间数据的复制。)

我只想使用子进程中的execv调用,所以我使用vfork而不是fork

无论 vfork() vs fork():孩子应以特殊的退出代码返回,父母应执行正常waitpid()并检查退出状态。

否则,如果要编写便携式应用程序,请使用使用vfork():它不是POSIX标准的一部分。

P.S。本文可能也引起人们的关注。如果您仍然想使用vfork(),请阅读此可怕的官方手册。

是。您不应修改变量 err 。在父进程中使用 waitpid 检查子进程的退出代码。还可以从 execv errno variable(请参阅MAN EXECV)中检查返回值,以确定为什么您的 execv 失败。

相关内容

  • 没有找到相关文章