请问叉子与执行器的区别

叉子与执行器的区别

.之间有什么区别?forkexec?


肥皂起泡泡
浏览 424回答 3
3回答

阿晨1998

使用fork和exec这体现了UNIX的精神,因为它提供了一种启动新进程的非常简单的方法。这个fork调用基本复制当前进程,在差不多了千方百计。并不是所有的东西都被复制(例如,某些实现中的资源限制),但是想法是创建尽可能接近的副本。新进程(子进程)获得不同的进程ID(PID),并将旧进程(父进程)的PID作为父进程PID(PPID)。因为这两个进程现在运行的代码完全相同,它们可以根据fork-孩子得到0,父母得到孩子的PID。当然,假设fork调用有效-如果没有,则不会创建任何子级,并且父程序将获得一个错误代码。这个execCall是一种以新程序替换整个当前进程的方法。它将程序加载到当前进程空间,并从入口点运行它。所以,fork和exec经常按顺序使用,以使一个新程序作为当前进程的子进程运行。当您尝试运行这样的程序时,shell通常会这样做。find-壳叉,然后子装载find将程序输入内存,设置所有命令行参数、标准I/O等。但它们不需要一起使用。对于一个程序来说,完全可以接受fork本身没有exec例如,如果程序同时包含父代码和子代码(您需要小心操作,每个实现可能都有限制)。这在守护进程中被大量使用(而且现在仍然如此),这些守护进程只需在TCP端口上侦听和fork当父程序返回到侦听过程中处理特定请求的自身副本。类似地,那些知道它们已经完成并且只想运行另一个程序的程序不需要fork,&nbsp;exec然后wait为了孩子。他们可以直接将子程序加载到他们的进程空间中。一些UNIX实现有一个优化的fork它使用的是他们所谓的抄写。这是一个延迟复制进程空间的技巧。fork直到程序试图在那个空间改变一些东西。这对于那些仅使用fork而不是exec因为他们不需要复制整个进程空间。如果exec&nbsp;是调用如下fork(这是通常发生的情况),这会导致对进程空间的写入,然后对子进程进行复制。请注意,有一个完整的家庭exec电话(execl,&nbsp;execle,&nbsp;execve等等)但是exec在上下文中,意思是它们中的任何一个。下图说明了典型的fork/exec操作时,bashshell用于列出具有ls指挥:+--------+| pid=7&nbsp; || ppid=4 || bash&nbsp; &nbsp;|+--------+&nbsp; &nbsp; |&nbsp; &nbsp; | calls fork&nbsp; &nbsp; V+--------+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+--------+| pid=7&nbsp; |&nbsp; &nbsp; forks&nbsp; &nbsp; | pid=22 || ppid=4 | ----------> | ppid=7 || bash&nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| bash&nbsp; &nbsp;|+--------+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+--------+&nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; | waits for pid 22&nbsp; &nbsp; &nbsp;| calls exec to run ls&nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; V&nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; +--------+&nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | pid=22 |&nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | ppid=7 |&nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | ls&nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; V&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; +--------++--------+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|| pid=7&nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| exits| ppid=4 | <---------------+| bash&nbsp; &nbsp;|+--------+&nbsp; &nbsp; |&nbsp; &nbsp; | continues&nbsp;

慕森卡

我认为一些概念马克·罗奇金德的“高级Unix编程”的不同角色。fork()/exec(),尤其是对于那些习惯Windows的人来说CreateProcess()模型:A&nbsp;程序是保存在磁盘上常规文件中的指令和数据的集合。(来自1.1.2程序、进程和线程).为了运行程序,首先要求内核创建一个新的加工过程,这是一个程序执行的环境。(也来自1.1.2程序、进程和线程).如果不完全理解进程和程序之间的区别,就不可能理解EXEC或FRACK系统调用。如果这些术语对您来说是新的,您可能想要返回并检查第1.1.2节。如果您现在准备继续,我们将在一句话中总结其区别:流程是一个由指令、用户数据和系统数据段以及在运行时获得的许多其他资源组成的执行环境,而程序是包含用于初始化进程的指令和用户数据段的指令和数据的文件。(来自5.3exec系统呼叫)一旦您理解了程序和进程之间的区别,fork()和exec()职能可概括为:fork()创建当前进程的副本。exec()将当前进程中的程序替换为另一个程序。(这本质上是简化的“用于假人”版本的帕克斯·辉洛的答案要详细得多)
打开App,查看更多内容
随时随地看视频慕课网APP