GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi devons-nous passer deux fois le nom du fichier dans les fonctions Exec ?

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);

Linux
  1. Pourquoi le PC se fige-t-il pendant que je copie un fichier sur une clé USB ?

  2. La fête ?

  3. Linux - Pourquoi n'y a-t-il pas de système de fichiers Rootfs présent sur le système ?

  4. Comment passer le contenu d'un fichier en tant que paramètre de ligne de commande ?

  5. Pourquoi Ls et Hexdump ne sont-ils pas d'accord sur la taille du fichier ?

Pourquoi plusieurs instances de Mate-terminal ont-elles le même pid ?

Pourquoi le descripteur de fichier est-il ouvert et lu une seule fois ?

Comment vérifier le nom de la base de données Joomla ?

Où se trouve le fichier d'en-tête <conio.h> sous Linux ? Pourquoi ne puis-je pas trouver <conio.h> ?

Impossible de renommer un fichier dont le nom commence par un trait d'union

Pourquoi pvremove a-t-il une force en double dans la page de manuel ?