Bonjour à tous, je suis actuellement entrain de concevoir une petite épreuve, un challenge, pour un site quelconque.
Je fais face à un problème un peu bizarre, je m'explique.
Je crée une relation père/fils.
Les PIDS respectifs sont connus:
- le fils connaît bien son PID + celui de son père
- le père connaît bien son PID + celui de son fils.
Mais le problème est que je veux que le père se mette en attente de la terminaison de son fils, grace a un wait(&status).
Normalement, wait() renvoit la valeur de PID du fils, venant juste d'etre terminé.
Or quand j'affiche ce résultat, j'obtient une mauvaise valeur du PID pour le fils.
En effet, j'obtient toujours comme résultat du wait : PID du fils + 1.
Ce qui me dérange énormément, car je voudrais récupérer la valeur du exit() fait par le fils. De ce fait, puisqu'il attend la fin d'un mauvais PID (l'affiche tout du moins), il ne récupère pas la valeur du exit fait par le fils. (grace à WEXITSTATUS(status) )
Je ne vois vraiment pas pourquoi
Voici un extrait du code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
int fils;
fils=fork();
switch(fils)
{
case 0:
if(fp != NULL) //juste pour savoir si un descripteur à bien pu être ouvert
{
printf("PID Fils %d, PID de mon pere %d\n",(int)getpid(),(int)getppid());
exit(entier égal au resultat dun traitement ); // entier = 5 ou 6 pour etre précis
}
else
{
exit(7);
}
break;
case -1:
printf("Le fork a échoué\n");
break;
default:
{
printf("PID Pere %d PID Fils %d\n",(int)getpid(), fils);
ret_val = wait(&status);
printf("Valeur de retour du process %d est %04x avec comme indice de terminaison %d \n",ret_val,WEXITSTATUS(status),WIFEXITED(status)); |
Et voici un exemple de résultat que j'obtient :
1 2 3 4
|
PID Fils 9096, PID de mon pere 9087
PID Pere 9087 PID Fils 9096
Valeur de retour du process 9088 est 0001 avec comme indice de terminaison 1 |
On voit bien qu'il me sort une valeur PID fils bidon, donc un code de retour status bidon qui ne varie jamais.
Merci d'avance
Partager