创建一个没有fork()的子进程

时间:2019-01-11 19:08:48

标签: c operating-system fork child-process execvp

有没有一种方法可以在没有fork()的情况下专门使用execvp()来启动子进程?

4 个答案:

答案 0 :(得分:1)

与Windows系统不同,在Windows系统中创建新过程和执行新过程映像是一步完成的,而Linux和其他类似UNIX的系统则将它们作为两个不同的步骤来完成。

fork函数与调用过程完全相同,实际上返回两次,一次返回到父进程,一次返回到子进程。 execvp函数(以及exec系列中的其他函数)在同一过程中执行新的过程映像,从而覆盖现有过程映像。

您可以在不先致电execvp的情况下致电fork。如果是这样,那仅意味着当前正在运行的程序将消失并被给定程序替换。但是,fork创建新流程的方式

答案 1 :(得分:1)

对您的问题的脚回答是“否”。创建新进程的 only 系统调用为fork。底层execvp(称为execve)的系统调用将新的程序加载到现有进程中,这是另一回事。

某些类型的Unix除了fork(例如vforkrforkclone)之外还具有其他系统调用,它们会创建一个新的进程,但是它们只是fork本身,它们都不是POSIX标准的一部分,该标准指定了您可以在自称Unix的任何东西上依靠的功能。

稍微有用的答案是,您可能正在寻找posix_spawn,这是一个将forkexec包装到单个操作中的库例程,但是我发现它是比起编写自己的fork + exec子例程,更麻烦的是正确使用它。 YMMV。

答案 2 :(得分:0)

如用户zwol所述,execve()不会派生新进程。而是替换了 current 进程的地址空间和CPU状态, 从可执行文件名加载新的地址空间,并从以下位置启动 main(),带有参数列表argv和环境变量列表envp。 它保留pid和打开的文件。

int execve(const char *filename,char *const argv [],char *const envp[]);

filename:要运行的可执行文件的名称
argv:命令行参数
envp:环境变量设置(例如$PATH$HOME等)

答案 3 :(得分:0)

posix_spawn是创建子进程而无需直接调用fork的唯一posix兼容方法。我说“直接”是因为历史上posix_spawn本身仅称为forkvfork。但是,在GNU / linux中不再是这种情况。 posix_spawn本身可能比fork更有效率,除了在代码尝试运行其他可执行文件时可能在概念上更合适。

如果您不担心可移植性,则可以放弃posix并将其直接耦合到目标内核。在Linux上,用于创建子进程的系统调用为clone。在回答此问题时,手册页提供了三种变体的文档,包括相对较新的clone3

我相信您可以从手册页中获取示例,并将execvp调用添加到childFunc。我还没有尝试过!