现在的位置: 首页 > 综合 > 正文

fork后的exec

2018年04月01日 ⁄ 综合 ⁄ 共 732字 ⁄ 字号 评论关闭

    由fork创建的新进程被称为子进程。子进程和父进程继续执行fork调用之后的指令,子进程是父进程的一个副本。例如,子进程获得父进程数据空间、堆和栈的副本。注意,这是子进程所拥有的副本。父子进程并不共享这些存储空间部分。父子进程共享正文段。

    由于在fork后经常跟随者exec,所以现在的很多实现并不执行一个父进程数据段、栈和堆的完全复制。作为替代,使用了写时复制技术,这些区域由父子进程共享,而内核将他们的访问权限修改为只读,如果父子进程的人一个试图修改这些区域,此时才为修改区域的那块内存制作一个副本,通常是虚拟存储器系统的一个“页”。

    fork之后若跟随执行exec后,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以先后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段。

    总结下,fork后跟随exec和fork后不跟随exec的区别:

    1、fork后跟随exec则新程序从其main函数开始执行,在新的程序启动后,原来的程序就不再执行了,而不跟随exec则程序执行fork调用后的指令段;

    2、fork后跟随exec会产生一个全新的程序替换当前进程的正文、数据、堆和栈段,其进程ID不变,而不跟随exec则父子进程共享正文段,且子进程获得父进程的数据空间、堆和栈的副本。写时复制技术则使得父子进程进行最大程度的共享,只有修改区域进行副本的制作;

    3、exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开,除非指定了close on exec标志,但需要注意,任何在原进程中已打开的目录流都将在新进程中被关闭。

抱歉!评论已关闭.