我正在教授操作系统课程,并试图将我的注意力集中在创建新流程的技术上fork
。execve
我目前的理解是,fork 会完整复制旧进程,建立新的 PID 和父/子关系,但除此之外几乎不做其他事情。
另一方面,子进程创建后,它运行 execve 以用新进程替换其大部分内存。比如,程序代码、栈、堆全部替换,从头开始,作为一个新的程序。
但并不是所有的东西都会在新流程中被取代。子进程继承文件描述符(允许在 execve 之前设置管道)、进程 ID (PID) 和用户 ID (UID) 以及一些权限(手册页)。
我想未由 execve 调用替换的属性的完整列表相当长,但是是否还有其他关键属性(例如我上面提到的那些我缺少的属性)?
答案1
由于我们正在专门讨论 Linux(至少,我认为这就是您想要的,因为您使用了操作系统标签),fork
和execve
联机帮助页是适当的参考;他们列出了所有的属性不是保存下来。大多数这种行为是由 POSIX 指定的,但也有一些 Linux 的特殊性。
手册页没有列出以下属性是保留,而是关注那些不保留的:
所有进程属性都会在 期间保留
execve()
,但以下属性除外:
ETC。
我不会试图通过列出所有保留的属性来回答您的问题。不过,我将指出一个被保留的关键属性,并且您尚未列出:忽略和默认信号在execve
.这意味着父级可以忽略信号(至少是可以忽略的信号),并且该行为将传播到任何子级。这就是允许nohup
工作的原因。
exec()
您可以在或fork()
的第 28.4 节中找到流程属性的完整列表,以及对它们发生的情况的解释。Linux 编程接口。