fork et code retour

fork et code retour - C - Programmation

Marsh Posté le 25-03-2005 à 12:28:26    

bonjour à tous,
 
Bon désolé si la solution a déjà été donné sur le forum (en tout cas j'ai pas trouvé la totalité de la réponse...), mais j'ai une question.
 
Je veux faire executer un script par un fils et savoir si ce script n'a pas retourné d'erreur. Donc en gros, je fais un fork puis un execl, et avec le père j'attend la mort du fils avec un wait, mais comment connaitre le code de retour du script. Attention, je ne veux pas lire la sortie standard du script (comme on pourrait le faire avec popen), je veux le code de retour du script pour savoir s'il a pas foiré. Mon problème c'est que c'est bien beau d'attendre le fils, mais il me dit pas si le script a bien marché. J'espère que je suis assez clair...
 
merci d'avance.
a+

Reply

Marsh Posté le 25-03-2005 à 12:28:26   

Reply

Marsh Posté le 25-03-2005 à 12:54:06    

stef203 a écrit :

bonjour à tous,
 
Bon désolé si la solution a déjà été donné sur le forum (en tout cas j'ai pas trouvé la totalité de la réponse...), mais j'ai une question.
 
Je veux faire executer un script par un fils et savoir si ce script n'a pas retourné d'erreur. Donc en gros, je fais un fork puis un execl, et avec le père j'attend la mort du fils avec un wait, mais comment connaitre le code de retour du script. Attention, je ne veux pas lire la sortie standard du script (comme on pourrait le faire avec popen), je veux le code de retour du script pour savoir s'il a pas foiré. Mon problème c'est que c'est bien beau d'attendre le fils, mais il me dit pas si le script a bien marché. J'espère que je suis assez clair...


 
Quand tu fais un "wait", tu lui passes en paramètre l'adresse d'une variable de type "int"

Code :
  1. int retour;
  2. ...
  3. wait(&retour);


 
Lorsque la fonction "wait" récupèrera le fils qui se termine, elle stockera dans la variable dont tu lui as passé l'adresse la cause de la mort du fils
- si le fils a été killé par un "kill(x)", la valeur "x" sera stockée dans l'octet de poid faible de ta variable (les 8 derniers bits)
- si le fils s'est terminé avec "exit(y)", la valeur "y" (correspondant au code de retour) sera stockée dans l'octet de poid fort de ta variable (les 8 premiers bits) et les 8 bits restants (réservés à la valeur "x" ) seront mis à 0 ce qui te permet de vérifier si c'est "kill" ou "exit"
 
Pour tester les bits de ta variable, tu peux utiliser les opérateurs "OU" et "ET" mais c'est pas portable. Si t'inclues "sys/wait.h" tu auras à ta disposition 4 macro pour faire le boulot à ta place:
- WIFEXITED(retour) te renvoie "vrai" si ça a été "exit"
- WIFSIGNALED(retour) te renvoie "vrai" si ça a été "kill"
- WEXITSTATUS(retour) te renvoie la valeur du "exit"
- WTERMSIG(retour) te renvoie la valeur du "kill"
 
Il y a un truc qui me chiffonne, c'est que toute cette théorie marche très bien quand on programme soi-même son fils. Je ne sais pas trop comment ça se passe lorsque le fils a été remplacé par le programme lancé par "execl" (recouvrement du processus fils par le nouveau programme)...


Message édité par Sve@r le 25-03-2005 à 12:57:51

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 25-03-2005 à 13:34:55    

ok merci je vais regarder de ce coté la, a priori, ca semble être pile poil ce qu'il me faut.

Reply

Marsh Posté le 25-03-2005 à 15:45:51    

Sve@r a écrit :

Il y a un truc qui me chiffonne, c'est que toute cette théorie marche très bien quand on programme soi-même son fils. Je ne sais pas trop comment ça se passe lorsque le fils a été remplacé par le programme lancé par "execl" (recouvrement du processus fils par le nouveau programme)...


 
Ca ne change absolument rien. Tu recois le code de retour du processus execute et le signal qui l'a tue.

Reply

Marsh Posté le 25-03-2005 à 18:21:20    

matafan a écrit :

Ca ne change absolument rien. Tu recois le code de retour du processus execute et le signal qui l'a tue.


 
Merci  :sol:


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed