Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

code retour de fonction system

2 réponses
Avatar
Laurent Plagne
Bonjour,

quelqu'un aurait-il une explication au fonctionnement suivant qui me
para=EEt fort =E9trange ?

J'utilise la fonction de la libc "system" (man 3 system) et je cherche
a r=E9cup=E9rer le code de retour de la commande qui s'est ex=E9cut=E9e. Or
j'obtiens une valeur compl=E8tement diff=E9rente entre le code de retour
au sein de la fonction system et celui renvoy=E9 au C/C++. Le code
suivant montre le probl=E8me :

#include <iostream>
#include <cstdlib>

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

Le r=E9sultat sur Debian etch ou Ubuntu 9.04 avec g++ 3.4 ou 4.3 est le
suivant :
rc=3D1
return code =3D 256

Pourquoi ?
Merci de votre aide

2 réponses

Avatar
pjb
Laurent Plagne writes:

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__
Avatar
Laurent
On 7 sep, 15:17, (Pascal J. Bourguignon) wrote:
Laurent Plagne writes:
> 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!