在Windows中,您可以使用CreateProcess()执行流程。
现在我想知道如何在Linux中执行一个流程,到目前为止我只发现你可以通过调用fork()
然后调用exec()
来实现这一点。
这是在Linux中执行进程的唯一方法吗?
答案 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()
部分只是改变新进程运行的代码。