c - fork() + exec() 是在 Linux 中执行进程的唯一方法吗?

标签 c linux

在 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/

相关文章:

linux - 搜索并替换第一次出现的字符串

linux - shell脚本中的重复变量

linux - dotnet 核心 System.Threading.Timer 只触发一次

c - 为什么我的 if 语句不起作用

c - gsl_complex_mul 中的链接错误

c - C中的空字符常量

c++ - 如何使用控制台窗口中的输入顶点在 glut 中绘制多边形?

linux - 用于创建文件夹和移动文件的“管家”脚本

c - 调试c代码时缓冲区溢出问题

linux - 如何为 linux shell 设置 TERM 环境变量