Pourquoi mes processus fourchus ne renvoient-ils pas la valeur que je veux récupérer?

Je dois actuellement écrire un programme qui crée autant de processus fourchus que l’utilisateur le souhaite, puis attendre que tous les processus se terminent et les laisser renvoyer un nombre aléatoire compris entre 1 et 6.

Ceci est mon code jusqu’à présent:

#include  #include  #include  int main(){ int n,i; int *returnvalue, value; int pid; int waitingID; returnvalue = &value; printf("How many processes to start?\n"); scanf("%d",&n); for(i=0; i  0){ waitingID = waitpid(pid, returnvalue, 0); printf("Return-value of %d is: %d\n", waitingID, *returnvalue); break; } else{ printf("A problem occured."); } } srand(time(NULL)); exit((rand()%6)+1); return 0; } 

En fait, cela fonctionne jusqu’à présent, mais je ne reçois jamais un chiffre entre 1 et 6, mais plutôt des valeurs telles que 768, 512, 256, etc.

On a l’impression que la ligne aléatoire est simplement ignorée.

Comment puis-je réparer mon code afin de renvoyer des valeurs aléatoires appropriées?

La valeur waitpid() par son second argument n’est pas le code de sortie du processus collecté. Il s’agit plutôt d’un masque de bits contenant le code de sortie (si en fait le processus est terminé) ainsi que plusieurs autres détails. Il existe une collection de macros déclarée dans wait.h par laquelle vous pouvez extraire les différentes pièces.

En particulier, étant donné waitpid(pid, returnvalue, 0) > 0 , vous pouvez déterminer si, en fait, le processus s’est WIFEXITED(*returnValue) par exemple, pour être arrêté) en testant WIFEXITED(*returnValue) . Si c’est effectivement le cas, vous pouvez obtenir le statut de sortie WEXITSTATUS(*returnValue) . Ainsi, vous pourriez écrire

  else if (pid > 0){ waitingID = waitpid(pid, returnvalue, 0); if (waitingID < 0) { perror("While waiting on a child process"); } else if (waitingId == 0) { printf("wait() unexpectedly returned 0\n"); } else if (WIFEXITED(*returnValue)) { printf("Process %d exited with code: %u\n", waitingID, WEXITSTATUS(*returnvalue)); } else { printf("Process %d was stopped or continued\n", waitingID); } break; }