Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/10/2015, à 14:39

DonutMan75

[RESOLU] Commande execl...

Bonjour à tous,

j'ai une question concernant la fonction execl en C (voir définition ici : http://linux.die.net/man/3/execl).

Typiquement, admettons que j'ai dans mon répertoire /users/toto/ un exécutable calcul qui prend deux arguments entiers et affiche sur la sortie standard la somme des deux. Je peux dans un premier temps l'exécuter dans un terminal par :

$ cd /users/toto/
$ ./calcul  2 3
2 + 3 = 5
$

Dans le cadre d'un programme en C, il faudrait pour obtenir le même comportement que j'inscrive :

execl("/users/toto/calcul", "./calcul", "2", "3");

Ma question est la suivante :
j'ai l'impression que le second argument de la fonction execl (en l'occurence ici "./calcul") pourrait être une chaîne totalement arbitraire. Par exemple, l'appel execl("/users/toto/calcul", "totoro", "2", "3") marche tout aussi bien. La seule différence c'est que dans le cas, l'exécutable "calcul" pensera qu'il a été appelé sous le nom "totoro". Est-ce exact ? Y'a t'il des cas de figures où cette différence pourrait avoir de l'importance ?

Par ailleurs les fonctions exec remplacent le code en cours par celui de l'exécutable appelé... Donc a priori, rien de ce qui suit l'appel à exec ne sera exécuté, est-ce correct ?

Merci d'avance smile

D.

Dernière modification par DonutMan75 (Le 23/10/2015, à 15:50)

Hors ligne

#2 Le 23/10/2015, à 15:34

claudius01

Re : [RESOLU] Commande execl...

Bonjour,

DonutMan75 a écrit :

... j'ai l'impression que le second argument de la fonction execl (en l’occurrence ici "./calcul") pourrait être une chaîne totalement arbitraire. Par exemple, l'appel execl("/users/toto/calcul", "totoro", "2", "3") marche tout aussi bien. La seule différence c'est que dans le cas, l'exécutable "calcul" pensera qu'il a été appelé sous le nom "totoro". Est-ce exact ?

Oui, car dans le man, il est bien écrit: "The const char *arg and subsequent ellipses in the execl(), execlp(), and execle() functions can be thought of as arg0, arg1, ..., argn.". En clair, le arg0 de l'exécutable "calcul" sera totoro ;-)

DonutMan75 a écrit :

Y'a t'il des cas de figures où cette différence pourrait avoir de l'importance ?

Lorsque l'exécutable utilise son arg0 qui, dans la pratique est le nom (path compris) avec lequel l'exécutable a été appelé...

DonutMan75 a écrit :

Par ailleurs les fonctions exec remplacent le code en cours par celui de l'exécutable appelé... Donc a priori, rien de ce qui suit l'appel à exec ne sera exécuté, est-ce correct ?

Oui lorsque la fonction exec n'échoue pas. Dans le cas contraire, le man précise bien:

Return Value

The exec() functions only return if an error has occurred. The return value is -1, and errno is set to indicate the error.

Ce qui permet d'appeler un process enfant depuis son père puis attendre la mort de son enfant comme dans Creating processes with fork and exec in Linux.

Dernière modification par claudius01 (Le 23/10/2015, à 15:43)

Hors ligne

#3 Le 23/10/2015, à 15:47

pingouinux

Re : [RESOLU] Commande execl...

Bonjour,
En complément de la réponse de claudius01 :
Je viens de tester : le arg0 de calcul est bien totoro si calcul est du C, mais /users/toto/calcul si calcul est du bash.

Hors ligne

#4 Le 23/10/2015, à 15:51

DonutMan75

Re : [RESOLU] Commande execl...

Bonjour,

ok c'est plus clair désormais !
Merci à vous deux pour vos lumières smile

Donut

Hors ligne