当一个进程 fork() 一个子进程时,两个进程是相关的。子进程从父进程继承了很多东西,包括一些 IPC 对象,例如管道和匿名内存映射。
如果子进程 execve() 是可执行文件,那么父进程和子进程是否变得无关?仅适用于相关流程的事情是否不再有效?
例如,以下说法是否正确
shell 进程 fork() 一个子进程到 execve() 一个可执行文件?
shell进程及其子进程不能仅通过相关进程的IPC机制进行通信?
谢谢。
答案1
execve()
完全取代内存。
它会关闭那些未标记为保持打开状态的文件句柄。 (通常,STDIN、STDOUT 和 STDERR 都是如此标记的。)请参阅标志O_CLOEXEC
。 (好吧,更准确地说,它关闭那些标记为关闭的文件描述符。)
它重置信号处理程序,但保持 SIG_IGN 和 SIG_DFL 不变。
它不会改变父/子关系或控制终端。
我不确定 SysV IPC 对象,但我认为它们一开始就没有特定的进程内存在。