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

标签 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 变量)。

最佳答案

Is above code is proper?

没有。 err 变量已经在子进程的内存中,因此父进程将看不到它的修改。

We should not modify any parent resource in child process created through vfork (I am modifying err variable).

该资源已过时。过去一些 *nix 系统尝试用 fork()/exec() 对来玩弄花招,但通常这些优化很大程度上会适得其反,导致意想不到的、难以执行的结果。重现问题。这就是为什么 vfork() 被从 recent versions of POSIX删除的原因。 .

通常,您可以在支持 vfork() 的现代系统上对 vfork() 做出以下假设:如果子进程执行操作系统意外的操作,则子进程将>从 vfork() 升级到普通 fork()

例如,在 Linux 上,fork()vfork() 之间的唯一区别是,在后一种情况下,更多的子数据会被放入 lazy COW 中。数据。其效果是 vfork()fork() 稍快,但如果 child 尝试访问尚未复制的内容,则可能会承受一些额外的性能损失。数据,因为它们尚未从父级复制。 (注意一个微妙的问题:父进程也可以修改数据。这也会触发父子进程之间的 COW 和数据重复。)

I just want to use execv call from the child process, So i am using vfork instead of fork.

无论 vfork()fork() 的情况如何,处理都应该是等效的:子级应该返回特殊的退出代码,而父级应该执行正常的 >waitpid() 并检查退出状态。

否则,如果您想编写可移植应用程序,请不要使用vfork():它不是 the POSIX standard 的一部分.

附注This article可能也会感兴趣。如果您仍然想使用 vfork(),请阅读此 scary official manpage .

关于c - 需要澄清有关 vfork 使用的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30252017/

相关文章:

c - 自动发现 C 依赖项

从主端更改伪 tty 回显模式

c - 确定进程是子进程还是父进程(不使用 fork 的返回值)

c - fork 如何使用 PID 杀死一个进程

在C中创建两个子进程并一个接一个地执行它们

在 C 中强制转换然后取消引用指针

c - 如何使用C在Linux中获取已安装驱动器的卷名?

python - 使用Python查询Linux包数据库

linux - Bash - 检查一个文件中的行是否存在于另一个文件中

c - 什么时候进行进程切换