【发布时间】:2014-08-14 14:37:24
【问题描述】:
我很想知道是否可以在 Linux 中使用 vfork+exec 的组合来实现 posix_spawn。以一种非常简化的方式(省略大多数可选参数),这可能看起来或多或少像这样:
int my_posix_spawn(pid_t *ppid, char **argv, char **env)
{
pid_t pid;
pid = vfork();
if (pid == -1)
return errno;
if (pid == 0)
{
/* Child */
execve(argv[0], argv, env);
/* If we got here, execve failed. How to communicate this to
* the parent? */
_exit(-1);
}
/* Parent */
if (ppid != NULL)
*ppid = pid;
return 0;
}
但是我想知道如何处理vfork 成功(因此创建子进程)但exec 调用失败的情况。似乎没有办法将此传达给父级,它只会看到它显然可以成功创建一个子进程(因为它会返回一个有效的 pid)
有什么想法吗?
【问题讨论】:
-
传达此类错误的方法是退出,状态为 127,如文档中所述。
-
另一个选项是
openargv[0]并在fork之前使用fstat验证它是否可执行,然后是fexecve它。这将排除许多可能导致execve失败的情况——尽管还有其他情况需要处理。 -
@n.m.但这是否意味着如果不对孩子调用 waitpid 或等效项就无法做到这一点?
-
@user3553031 这只是可能出错的众多事情之一..
-
父母无论如何都应该调用waitpid。