有没有一种方法可以在没有fork()
的情况下专门使用execvp()
来启动子进程?
答案 0 :(得分:1)
与Windows系统不同,在Windows系统中创建新过程和执行新过程映像是一步完成的,而Linux和其他类似UNIX的系统则将它们作为两个不同的步骤来完成。
fork
函数与调用过程完全相同,实际上返回两次,一次返回到父进程,一次返回到子进程。 execvp
函数(以及exec
系列中的其他函数)在同一过程中执行新的过程映像,从而覆盖现有过程映像。
您可以在不先致电execvp
的情况下致电fork
。如果是这样,那仅意味着当前正在运行的程序将消失并被给定程序替换。但是,fork
是创建新流程的方式。
答案 1 :(得分:1)
对您的问题的脚回答是“否”。创建新进程的 only 系统调用为fork
。底层execvp
(称为execve
)的系统调用将新的程序加载到现有进程中,这是另一回事。
某些类型的Unix除了fork
(例如vfork
,rfork
,clone
)之外还具有其他系统调用,它们会创建一个新的进程,但是它们只是fork
本身,它们都不是POSIX标准的一部分,该标准指定了您可以在自称Unix的任何东西上依靠的功能。
稍微有用的答案是,您可能正在寻找posix_spawn
,这是一个将fork
和exec
包装到单个操作中的库例程,但是我发现它是比起编写自己的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
本身仅称为fork
或vfork
。但是,在GNU / linux中不再是这种情况。 posix_spawn
本身可能比fork
更有效率,除了在代码尝试运行其他可执行文件时可能在概念上更合适。
如果您不担心可移植性,则可以放弃posix并将其直接耦合到目标内核。在Linux上,用于创建子进程的系统调用为clone。在回答此问题时,手册页提供了三种变体的文档,包括相对较新的clone3
。
我相信您可以从手册页中获取示例,并将execvp
调用添加到childFunc
。我还没有尝试过!