4

Этот вопрос может показаться немного глупым, но, поскольку в системах на основе Unix замена образа исполняемого файла выполняется за один шаг, заменяя текущий запущенный процесс, в вызове execve (и производных), вопрос заключается в следующем:

Почему sudo fork() по умолчанию перед execve процесса замены?

Путем разветвления перед этим необходимо инициализировать дополнительные элементы ядра, и хотя fork в некоторых Unix довольно оптимизирован, все же есть некоторые неизбежные элементы, которые необходимо инициализировать. Если fork() не было выполнено по умолчанию, пространство PID будет увеличиваться медленнее.

Если вам интересно, это поведение по умолчанию можно проверить, введя команду, такую как

sudo sleep 30

текущий код [ 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 */

В настоящее время я использую версию sudo 1.8.11p2, и она в любом случае порождает спящий режим с ключом -b или без него, поэтому кажется, что текущий код стал более сложным.

Я ищу ответ, который также охватывает, почему это поведение по умолчанию, и какие преимущества оно может принести нам.

2 ответа2

3

Пространство PID в Linux может быть увеличено до 22 с помощью простого sysctl; это действительно не проблема ...

В настоящее время большинство дистрибутивов Linux используют PAM, и sudo обычно также компилируется с поддержкой PAM. Помимо прочего, он вызывает pam_open_session() перед запуском вашей программы, поэтому он также должен вызывать pam_close_session() из того же процесса, поскольку ваша программа не будет знать, что для этого нужно (и, вероятно, ей не позволят сделай это).

2

Причина разветвления описана в разделе « Process model » на странице руководства. Соответствующий контент:

Этот дополнительный процесс позволяет, например, приостановить и возобновить выполнение команды. Без этого команда была бы в том, что POSIX называет «потерянной группой процессов», и не получала бы никаких сигналов управления заданиями. В особом случае, если плагин политики не определяет функцию закрытия и pty не требуется, sudo выполнит команду напрямую вместо вызова fork(2). Плагин политики sudoers будет определять функцию закрытия только тогда, когда включено ведение журнала ввода-вывода, требуется pty или включены параметры pam_session или pam_setcred. Обратите внимание, что pam_session и pam_setcred включены по умолчанию в системах, использующих PAM.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .