在“execve”调用期间会保留非特权进程的哪些属性?

在“execve”调用期间会保留非特权进程的哪些属性?

我正在教授操作系统课程,并试图将我的注意力集中在创建新流程的技术上forkexecve

我目前的理解是,fork 会完整复制旧进程,建立新的 PID 和父/子关系,但除此之外几乎不做其他事情。

另一方面,子进程创建后,它运行 execve 以用新进程替换其大部分内存。比如,程序代码、栈、堆全部替换,从头开始,作为一个新的程序。

但并不是所有的东西都会在新流程中被取代。子进程继承文件描述符(允许在 execve 之前设置管道)、进程 ID (PID) 和用户 ID (UID) 以及一些权限手册页)。

我想未由 execve 调用替换的属性的完整列表相当长,但是是否还有其他关键属性(例如我上面提到的那些我缺少的属性)?

答案1

由于我们正在专门讨论 Linux(至少,我认为这就是您想要的,因为您使用了标签),forkexecve联机帮助页是适当的参考;他们列出了所有的属性不是保存下来。大多数这种行为是由 POSIX 指定的,但也有一些 Linux 的特殊性。

手册页没有列出以下属性保留,而是关注那些不保留的:

所有进程属性都会在 期间保留execve(),但以下属性除外:

ETC。

我不会试图通过列出所有保留的属性来回答您的问题。不过,我将指出一个被保留的关键属性,并且您尚未列出:忽略和默认信号在execve.这意味着父级可以忽略信号(至少是可以忽略的信号),并且该行为将传播到任何子级。这就是允许nohup工作的原因。

exec()您可以在或fork()的第 28.4 节中找到流程属性的完整列表,以及对它们发生的情况的解释。Linux 编程接口

相关内容