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

时间:2017-11-08 20:37:29

标签: c linux

在Windows中,您可以使用CreateProcess()执行流程。

现在我想知道如何在Linux中执行一个流程,到目前为止我只发现你可以通过调用fork()然后调用exec()来实现这一点。

这是在Linux中执行进程的唯一方法吗?

1 个答案:

答案 0 :(得分:2)

Linux提供了用于启动新进程的高级和低级接口。

低级接口

主要的低级别界面是您已发现的界面:fork()。这通常由几个exec()函数中的一个快速跟随,但如果新进程执行与原始代码相同的代码是令人满意的,则不需要exec()。对于更习惯使用Windows API的人来说,这种情况比较常见。

POSIX还定义了posix_spawn()系列,它可以作为fork() + exec()的特殊用途替代品,适用于后者不适合的某些情况。 posix_spawn()是通过clone()库函数在Linux上实现的(参见下文)。

虽然它们不在POSIX中,但Linux还提供clone()vfork()作为fork()的替代方案。在现代Linux上,这些使用与fork()相同的系统系统调用,但不使用fork()库函数本身。没有太多理由再使用vfork()了 - 这可能表明POSIX曾经拥有它,但近十年前将它删除了。另一方面,特定于Linux的clone()有一些偶尔有用的有趣行为。它为fork系统调用提供了比这里讨论的任何其他函数更通用的接口,但它不可移植。一般来说,除非您需要无法提供的内容,否则请更喜欢fork()

高(呃)级接口

Linux也提供了一些更高级别的接口。主要的两个是system(),它执行一个shell命令并等待它完成,popen(),它启动一个shell命令,其标准输入或标准输出连接到管道,通过它并发运行的父进程可以与之通信。这两个都由POSIX指定,在POSIX系统上,它们被指定通过fork() + exec()运行。当然Windows也有system()_popen(),但不是fork()或任何直接模拟。

摘要

总的来说,用户空间Linux进程只能通过分叉启动一个新进程,但这与调用fork()库函数有区别,甚至是间接的。 GNU / Linux中至少有六种不同的C库函数可以作为启动新进程的接口。其中一些接口还允许新进程无限期地执行相同的代码(原始进程映像的副本),这有时是一件有用的事情。 fork() + fork()的{​​{1}}部分启动了新流程; exec()部分只是改变新进程运行的代码。