Cette question peut sembler un peu idiote, mais comme dans les systèmes basés sur Unix, le remplacement de l'image d'un exécutable se fait en une seule étape, en remplaçant le processus en cours d'exécution, dans l'appel de fonction execve
(et dérivés), la question est la suivante :
Pourquoi est-ce que sudo
fork()
par défaut avant execve
le processus de remplacement ?
En bifurquant avant, des éléments supplémentaires du noyau doivent être initialisés, et bien que la bifurcation soit assez optimisée dans certaines Unices, il y a toujours des éléments inévitables qui doivent être initialisés. Si fork()
ne se produisait pas par défaut, l'espace PID s'incrémenterait plus lentement.
Si vous êtes curieux, ce comportement par défaut peut être inspecté en lançant une commande telle que
sudo sleep 30
le code actuel [ 1 ] est plus compliquée à suivre, car de nombreuses fonctionnalités ont été ajoutées depuis ; mais dans la version hébergée par Apple [ 2 ] il est tout à fait clair ce qu'il fait.
#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 */
J'utilise actuellement la version 1.8.11p2 de sudo, et le sleep se déclenche dans les deux cas, avec ou sans l'attribut -b
switch, il semble donc que le code actuel soit devenu plus compliqué.
Je cherche une réponse qui couvre également pourquoi est-ce le comportement par défaut, et quels avantages cela peut nous apporter.