我想比父进程更早地运行子进程。我只想使用子过程中的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 失败。