execve() 是否会使子进程与其父进程无关?

execve() 是否会使子进程与其父进程无关?

当一个进程 fork() 一个子进程时,两个进程是相关的。子进程从父进程继承了很多东西,包括一些 IPC 对象,例如管道和匿名内存映射。

如果子进程 execve() 是可执行文件,那么父进程和子进程是否变得无关?仅适用于相关流程的事情是否不再有效?

例如,以下说法是否正确

  • shell 进程 fork() 一个子进程到 execve() 一个可执行文件?

  • shell进程及其子进程不能仅通过相关进程的IPC机制进行通信?

谢谢。

答案1

execve()完全取代内存。

它会关闭那些未标记为保持打开状态的文件句柄。 (通常,STDIN、STDOUT 和 STDERR 都是如此标记的。)请参阅标志O_CLOEXEC。 (好吧,更准确地说,它关闭那些标记为关闭的文件描述符。)

它重置信号处理程序,但保持 SIG_IGN 和 SIG_DFL 不变。

它不会改变父/子关系或控制终端。

我不确定 SysV IPC 对象,但我认为它们一开始就没有特定的进程内存在。

相关内容