这个问题可能看起来有点傻,但由于在基于 Unix 的系统中,替换可执行文件的映像是一步完成的,替换当前运行的进程,在函数调用execve
(和派生类)中,问题是:
为什么sudo
fork()
默认情况下在execve
更换过程之前?
通过之前的fork,额外的内核元素必须被初始化,虽然fork在一些Unices中已经相当优化,但仍然有一些不可避免的元素必须被初始化。如果fork()
默认情况下没有发生,则 PID 空间会增加得更慢。
如果您好奇,可以通过发出如下命令来检查此默认行为
sudo sleep 30
Run Code Online (Sandbox Code Playgroud)
当前的代码 [ 1 ] 遵循起来要复杂得多,因为此后添加了许多功能;但在 Apple [ 2 ]托管的版本中,它的作用非常清楚。
#ifndef PROFILING
if ((sudo_mode & MODE_BACKGROUND) && fork() > 0)
exit(0);
else
EXEC(safe_cmnd, NewArgv); /* run the command */
#else
/* Complicated code when profiling is enabled, but we don't care */
Run Code Online (Sandbox Code Playgroud)
我目前正在运行 sudo 版本 1.8.11p2,无论有没有-b
开关,它都会以任何一种方式产生睡眠,所以似乎当前的代码变得更加复杂。
我正在寻找一个答案,其中还涵盖了为什么这是默认行为,以及它可以为我们带来哪些优势。
我在引导内核结束时显示了一个问题,就在屏幕被清除之前,Linux 将我切换到 tty1,我可以在其中放置我的登录名。
如何在初始化后访问引导tty?(更具体地说,在 Archlinux 中)
而且我知道这不是同一个 tty 因为如果我按 Shift+RePag 我不会超出我当前的 tty