gpt4 book ai didi

c - 在 Linux 上实现 posix_spawn

转载 作者:IT王子 更新时间:2023-10-29 00:54:33 26 4
gpt4 key购买 nike

我很好奇是否可以实现 posix_spawn在 Linux 中使用 vfork+exec 的组合。以一种非常简化的方式(省略大多数可选参数),这看起来或多或少像这样:

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 返回)

有什么想法吗?

最佳答案

正如其他人在评论中指出的那样,posix_spawn 被允许创建一个子进程,该子进程由于执行失败或其他 fork 后失败而立即死亡;调用应用程序需要为此做好准备。但当然最好不要这样做。

an answer I wrote 中描述了向父级传达执行失败的一般过程。关于这个问题:What can cause exec to fail? What happens next? .

不幸的是,由于其令人讨厌的两次返回语义,您需要执行的一些操作在 vfork 之后是不合法的。我过去曾在 an article on ewontfix.com 中讨论过这个主题。 .制作避免复制 VM 的 posix_spawn 的解决方案似乎是使用 cloneCLONE_VM(可能还有 CLONE_VFORK ) 以获得共享内存但不在同一堆栈上运行的新进程。然而,这仍然需要非常小心,以避免对 libc 函数进行任何调用,这些函数可能会修改父进程使用的内存。我当前的实现在这里:

http://git.musl-libc.org/cgit/musl/tree/src/process/posix_spawn.c?id=v1.1.4

如您所见,它相当复杂。阅读 git 历史可能会提供有关所做的一些设计决策的信息。

关于c - 在 Linux 上实现 posix_spawn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25310798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com