J'ai lu Programmation avancée dans l'environnement UNIX par Stevens, chapitre 8.
J'ai lu et compris les six fonctions exec.
Une chose que je remarque est, dans toutes les fonctions exec :
- le premier argument est le nom du fichier / le nom du chemin (dépend de la fonction exec).
- le deuxième argument est argv[0] que nous obtenons dans
main()
, qui est le nom du fichier lui-même.
Nous devons donc ici passer deux fois le nom du fichier dans la fonction.
Y a-t-il une raison à cela (par exemple, nous ne pouvons pas obtenir le nom de fichier à partir du nom de chemin du premier argument) ?
Réponse acceptée :
Nous devons donc ici passer deux fois le nom du fichier dans la fonction.
Ce n'est pas tout à fait la même chose comme vous le remarquez en observant que un d'entre eux est utilisé comme argv[0]
valeur. Cela ne doit pas nécessairement être le même que le nom de base de l'exécutable ; beaucoup/la plupart des choses l'ignorent et vous pouvez y mettre ce que vous voulez.
Le premier est le chemin réel vers l'exécutable, pour lequel il existe une nécessité évidente. Le second est transmis au processus apparemment sous le nom utilisé pour l'invoquer, mais, par exemple :
execl("/bin/ls", "banana", "-l", NULL);
Fonctionnera bien, en supposant que /bin/ls
est le bon chemin.
Certaines applications utilisent cependant argv[0]
. Habituellement, ceux-ci ont un ou plusieurs liens symboliques dans $PATH
; c'est courant avec les utilitaires de compression (ils utilisent parfois des wrappers shell à la place). Si vous avez xz
installé, stat $(which xzcat)
montre qu'il s'agit d'un lien vers xz
, et man xzcat
est identique à man xz
ce qui explique « xzcat est équivalent à xz –decompress –stdout ». La façon dont xz peut dire comment il a été invoqué est en vérifiant argv[0]
, rendant ces équivalents :
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);