在 Windows 中,您可以使用 CreateProcess() 执行进程.
现在我想知道如何在 Linux 中执行一个进程,到目前为止我只发现你可以通过调用 fork()
然后调用 exec()
.
这是在 Linux 中执行进程的唯一方法吗?
最佳答案
Linux 为启动新进程提供了高级和低级接口(interface)。
底层接口(interface)
主要的低级接口(interface)是您已经发现的接口(interface):fork()
。这通常紧随几个 exec()
函数之一,但是如果新进程执行与原本的。对于更习惯 Windows API 的人来说,这比听起来更常见。
POSIX 还定义了 posix_spawn()
家族,在某些情况下作为 fork()
+ exec()
的特殊用途替代品后者不太适合。 posix_spawn()
在 Linux 上通过 clone()
库函数实现(见下)。
虽然它们不在 POSIX 中,但 Linux 还提供了 clone()
和 vfork()
作为 fork()
的替代方法。在现代 Linux 上,它们使用与 fork()
相同的系统调用,但不是 fork()
库函数本身。没有太多理由再使用 vfork()
—— 这可能表明 POSIX 曾经有它,但在将近十年前将其删除。另一方面,特定于 Linux 的 clone()
具有一些偶尔有用的有趣行为。它为 fork 系统调用提供了一个比这里讨论的任何其他函数都更通用的接口(interface),但它不可移植。一般来说,除非您需要它无法提供的东西,否则更喜欢 fork()
。
高层接口(interface)
Linux 也提供了一些更高级的接口(interface)。主要的两个是 system()
,它执行一个 shell 命令并等待它完成,以及 popen()
,它使用它的标准输入或连接到管道的标准输出,并发运行的父进程可以通过管道与其通信。这两者都是由 POSIX 指定的,在 POSIX 系统上,它们被指定通过 fork()
+ exec()
进行操作。当然,Windows 也有 system()
和 _popen()
,但没有 fork()
或任何直接模拟。
总结
总的来说,一个用户空间 Linux 进程只能通过 fork 来启动一个新进程,但这与调用 fork()
库函数是有区别的,即使是间接调用。 GNU/Linux 中至少有六个不同的 C 库函数可以作为启动新进程的接口(interface)。其中一些接口(interface)还允许新进程无限期地执行相同的代码(原始进程镜像的副本),这有时是一件很有用的事情。它是 fork()
的 fork()
部分 + exec()
启动一个新进程; exec()
部分仅更改新进程运行的代码。
关于c - fork() + exec() 是在 Linux 中执行进程的唯一方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47189198/