小编ssi*_*ice的帖子

为什么 sudo 在执行进程之前会分叉?

这个问题可能看起来有点傻,但由于在基于 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 unix sudo exec

5
推荐指数
1
解决办法
1782
查看次数

如何访问Linux启动tty

我在引导内核结束时显示了一个问题,就在屏幕被清除之前,Linux 将我切换到 tty1,我可以在其中放置我的登录名。

如何在初始化后访问引导tty?(更具体地说,在 Archlinux 中)

而且我知道这不是同一个 tty 因为如果我按 Shift+RePag 我不会超出我当前的 tty

linux kernel tty arch-linux

2
推荐指数
1
解决办法
1617
查看次数

标签 统计

linux ×2

arch-linux ×1

exec ×1

kernel ×1

sudo ×1

tty ×1

unix ×1