当前位置: 技术问答>linux和unix
fork/exec的工作机制,我还是不太懂
来源: 互联网 发布时间:2015-10-11
本文导语: 书上说exec后原进程环境会被替代,是不是exec我在父进程里分配的东西,包括malloc的东西也不用手动释放了? 但是我看到advanced linux programming一书中,在fork后exec前,close掉所有的file descriptor,这是为什么呢? exec前我到底要...
书上说exec后原进程环境会被替代,是不是exec我在父进程里分配的东西,包括malloc的东西也不用手动释放了?
但是我看到advanced linux programming一书中,在fork后exec前,close掉所有的file descriptor,这是为什么呢?
exec前我到底要不要释放资源?
但是我看到advanced linux programming一书中,在fork后exec前,close掉所有的file descriptor,这是为什么呢?
exec前我到底要不要释放资源?
|
下面是“Unix环境高级编程”里面摘录的一段。更多的内容可能需要你自己去仔细研读了
用f o r k函数创建子进程后,子进程往往要调用一种e x e c函数以执行另一个程序。
当进程调用一种e x e c函数时,该进程完全由新程序代换,而新程序则从其m a i n函数开始执行。
因为调用e x e c并不创建新进程,所以前后的进程I D并未改变。e x e c只是用另一个新程序替换了
当前进程的正文、数据、堆和栈段。
前面曾提及在执行e x e c后,进程I D没有改变。除此之外,执行新程序的进程还保持了原进
程的下列特征:
? 进程I D和父进程I D。
? 实际用户I D和实际组I D。
? 添加组I D。
? 进程组I D。
? 对话期I D。
? 控制终端。
? 闹钟尚余留的时间。
? 当前工作目录。
? 根目录。
? 文件方式创建屏蔽字。
? 文件锁。
? 进程信号屏蔽。
? 未决信号。
? 资源限制。
? tms_utime, tms_stime, tms_cutime以及t m s _ u s t i m e值。
对打开文件的处理与每个描述符的e x e c关闭标志值有关。见图3 - 1以及3 . 1 3 节中对
F D _ C L O E X E C的说明,进程中每个打开描述符都有一个e x e c关闭标志。若此标志设置,则在
执行e x e c时关闭该描述符,否则该描述符仍打开。除非特地用f c n t l设置了该标志,否则系统的
默认操作是在e x e c后仍保持这种描述符打开。
用f o r k函数创建子进程后,子进程往往要调用一种e x e c函数以执行另一个程序。
当进程调用一种e x e c函数时,该进程完全由新程序代换,而新程序则从其m a i n函数开始执行。
因为调用e x e c并不创建新进程,所以前后的进程I D并未改变。e x e c只是用另一个新程序替换了
当前进程的正文、数据、堆和栈段。
前面曾提及在执行e x e c后,进程I D没有改变。除此之外,执行新程序的进程还保持了原进
程的下列特征:
? 进程I D和父进程I D。
? 实际用户I D和实际组I D。
? 添加组I D。
? 进程组I D。
? 对话期I D。
? 控制终端。
? 闹钟尚余留的时间。
? 当前工作目录。
? 根目录。
? 文件方式创建屏蔽字。
? 文件锁。
? 进程信号屏蔽。
? 未决信号。
? 资源限制。
? tms_utime, tms_stime, tms_cutime以及t m s _ u s t i m e值。
对打开文件的处理与每个描述符的e x e c关闭标志值有关。见图3 - 1以及3 . 1 3 节中对
F D _ C L O E X E C的说明,进程中每个打开描述符都有一个e x e c关闭标志。若此标志设置,则在
执行e x e c时关闭该描述符,否则该描述符仍打开。除非特地用f c n t l设置了该标志,否则系统的
默认操作是在e x e c后仍保持这种描述符打开。