code retour de fonction system

Le
Laurent Plagne
Bonjour,

quelqu'un aurait-il une explication au fonctionnement suivant qui me
paraît fort étrange ?

J'utilise la fonction de la libc "system" (man 3 system) et je cherche
a récupérer le code de retour de la commande qui s'est exécutée. Or
j'obtiens une valeur complètement différente entre le code de retour
au sein de la fonction system et celui renvoyé au C/C++. Le code
suivant montre le problème :

#include <iostream>
#include <cstdlib>

int main( int argc, char ** argv )
{
int rc = system ( "false ; rc=$? ; echo rc=$rc ; exit $rc" );
std::cout << "return code = " << rc << std::endl;
return 0;
}

Le résultat sur Debian etch ou Ubuntu 9.04 avec g++ 3.4 ou 4.3 est le
suivant :
rc=1
return code = 256

Pourquoi ?
Merci de votre aide
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
pjb
Le #20087401
Laurent Plagne
Bonjour,

quelqu'un aurait-il une explication au fonctionnement suivant qui me
paraît fort étrange ?

J'utilise la fonction de la libc "system" (man 3 system) et je cherche
a récupérer le code de retour de la commande qui s'est exécutée. Or
j'obtiens une valeur complètement différente entre le code de retour
au sein de la fonction system et celui renvoyé au C/C++. Le code
suivant montre le problème :

#include <iostream>
#include <cstdlib>

int main( int argc, char ** argv )
{
int rc = system ( "false ; rc=$? ; echo rc=$rc ; exit $rc" );
std::cout << "return code = " << rc << std::endl;
return 0;
}

Le résultat sur Debian etch ou Ubuntu 9.04 avec g++ 3.4 ou 4.3 est le
suivant :
rc=1
return code = 256

Pourquoi ?



Parce que.

La réponse est sur la page : man 2 wait

C'est que la transmission du code retourné par main dépend du système
d'exploitation. Pour le récuperer de façon portable POSIX, il faut
utiliser wait(2) (ou une de ses acolytes), et la macro WEXITSTATUS(status).

Note que le status retourné par wait(2) n'est pas (seulement) le code
retourné par main ; il le contient, mais il y a d'autres informations
dedans (cf les autres macros décrites sur man 2 wait).




--
__Pascal Bourguignon__
Laurent
Le #20087571
On 7 sep, 15:17, (Pascal J. Bourguignon) wrote:
Laurent Plagne > Bonjour,

> quelqu'un aurait-il une explication au fonctionnement suivant qui me
> paraît fort étrange ?

> J'utilise la fonction de la libc "system" (man 3 system) et je cherche
> a récupérer le code de retour de la commande qui s'est exécutée . Or
> j'obtiens une valeur complètement différente entre le code de retou r
> au sein de la fonction system et celui renvoyé au C/C++. Le code
> suivant montre le problème :

> #include <iostream>
> #include <cstdlib>

> int main( int argc, char ** argv )
> {
> int rc = system ( "false ; rc=$? ; echo rc=$rc ; exit $rc" );
> std::cout << "return code = " << rc << std::endl;
> return 0;
> }

> Le résultat sur Debian etch ou Ubuntu 9.04 avec g++ 3.4 ou 4.3 est le
> suivant :
> rc=1
> return code = 256

> Pourquoi ?

Parce que.

La réponse est sur la page : man 2 wait

C'est que la transmission du code retourné par main dépend du systè me
d'exploitation. Pour le récuperer de façon portable POSIX, il faut
utiliser wait(2) (ou une de ses acolytes), et la macro WEXITSTATUS(status ).

Note que le status retourné par wait(2) n'est pas (seulement) le code
retourné par main ; il le contient, mais il y a d'autres informations
dedans (cf les autres macros décrites sur man 2 wait).

--
__Pascal Bourguignon__



Merci beaucoup , ça marche!
Publicité
Poster une réponse
Anonyme