Этот вопрос может показаться немного глупым, но, поскольку в системах на основе 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
или без него, поэтому кажется, что текущий код стал более сложным.
Я ищу ответ, который также охватывает, почему это поведение по умолчанию, и какие преимущества оно может принести нам.