Esta questão pode parecer um pouco tola, mas como em sistemas baseados em Unix, a substituição da imagem de um executável é feita em uma única etapa, substituindo o processo atualmente em execução na chamada de função execve
(e derivativos). é:
Por que sudo
fork()
por padrão antes de execve
'do processo de substituição?
Por forking before, elementos adicionais do kernel precisam ser inicializados, e embora fork seja bastante otimizado em alguns Unices, ainda existem alguns elementos inevitáveis que devem ser inicializados. Se fork()
não ocorresse por padrão, o espaço PID aumentaria mais lentamente.
Se você está curioso, esse comportamento padrão pode ser inspecionado emitindo um comando como
sudo sleep 30
o código atual [ 1 ] é bem mais complicado de seguir, já que muitos recursos foram adicionados Desde a; mas na versão hospedada pela Apple [ 2 ] é bem claro o que faz.
#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 */
No momento, estou executando a versão sudo 1.8.11p2, e ela gera o sono de qualquer forma, com ou sem a opção -b
, portanto, parece que o código atual ficou mais complicado.
Estou à procura de uma resposta que abranja também por que é este o comportamento padrão e quais os benefícios que isso pode nos trazer.