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

Jos*_*der 2 linux process capabilities exec

我正在教授操作系统课程,并试图围绕创建新进程的fork/execve技术进行思考。

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

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

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

我想没有被 execve 调用替换的属性的完整列表很长,但是是否还有其他关键属性,例如我上面提到的那些我遗漏的?

Ste*_*itt 5

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

该名男子的网页没有列出其属性保留下来,而不是专注于那些没有:

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

等等。

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

您可以在The Linux Programming Interface 的第 28.4 节中找到进程属性的完整列表,并在exec()或上解释它们会发生什么。fork()