繁体   English   中英

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

[英]Is fork() + exec() the only way to execute a process in Linux?

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

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

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

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

低层介面

主要的底层接口是您已经发现的接口: fork() 这通常很快就会由几个exec()函数之一exec() ,但是如果新进程可以执行与原始代码相同的代码,则不需要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系统调用提供了更通用的接口,但它不是可移植的。 一般来说,除非您需要它不能提供的东西,否则最好使用fork()

高级界面

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

摘要

总体而言,用户空间Linux进程只能通过分叉来启动新进程,但这与调用fork()库函数(甚至是间接调用fork()有所区别。 GNU / Linux中至少有六个不同的C库函数可以用作启动新进程的接口。 这些接口中的某些接口还允许新流程无限期地执行相同的代码(原始流程镜像的副本),这有时是有用的。 fork() + exec()fork()部分启动了新进程; exec()部分仅更改新进程运行的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM