Utilisation correcte de fork, wait, exit, etc.

J’ai ce problème à résoudre et je ne sais pas comment le résoudre car nous ne pouvons utiliser que quelques appels système pour le résoudre et je ne vois pas en quoi ils sont utiles à la situation.

L’exercice:
J’ai une masortingce de taille [10] [1000000] avec des nombres entiers et pour chaque ligne, je crée un nouveau processus avec fork (). L’idée de chaque processus est de parcourir tous les numéros de cette ligne spécifique et de rechercher un numéro spécifique, puis d’imprimer un message à ce sujet. C’était la première étape du problème et c’est fait. La deuxième étape consiste à imprimer le total des occurrences de ce nombre sur chaque ligne par commande . Et finalement, le total des occurrences de ce nombre.

Les appels:
Les appels système que je peux utiliser sont décrits comme suit dans le document de cet exercice:

  • pid_t fork(void);
  • void exit(int status);
  • pid_t wait(int *status);
  • pid_t waitpid(pid_t pid, int *status, int options);

Le problème:
Je ne sais pas comment le faire, car l’appel exit() me permet uniquement de transmettre un nombre inférieur à 256; que se passe-t-il si le nombre d’occurrences est supérieur à ce nombre? Comment dois-je retourner un tel numéro?

Un autre problème:
Je ne comprends pas très bien la différence entre wait() et waitpid() et comment / où utiliser l’un par rapport à l’autre. Outre les pages de manuel, existe-t-il une documentation supplémentaire permettant de voir des exemples de code et permettant de mieux les comprendre? Ou quelqu’un peut-il m’expliquer les différences et fournir un exemple de base démontrant ces différences?

    Utilisez waitpid() pour waitpid() les statuts de sortie des processus enfants en séquence; L’utilisation de wait() ne donne aucune garantie sur la séquence dans laquelle les cadavres d’enfants seront récupérés.

    Sous Unix, l’état de sortie est limité à 8 bits, qui peuvent être traités comme signés ou non signés par le programme récupérant les données. Vous obtenez également une valeur de 8 bits identifiant le numéro de signal et l’état de vidage principal de l’enfant terminé. Autant que je sache, les bits d’état ou de signal sont toujours à zéro (et souvent les deux, lorsque le processus se termine correctement).

    Si vous ne savez pas que les numéros à renvoyer sont inférieurs à 256, l’état de sortie n’est pas la solution. Comme d’autres l’ont dit, vous devez utiliser un autre IPC dans ce cas. Si les seuls appels système autorisés sont ceux-là, vous devez alors conclure que les valeurs seront inférieures à 255 ou que les débordements importent peu. Aucune conclusion satisfaisante en dehors d’un devoir, mais dans le «monde réel», vous n’êtes pas limité à 4 appels système non plus.

    Voir aussi Codes de sortie supérieurs à 255? . Notez que sous Windows, la gamme de codes de sortie est beaucoup plus large, mais vous n’utilisez pas les appels système répertoriés dans la question.


    Observation: quand je exit(1) , la valeur dans le statut de wait() est 256; Y at-il une raison à cela?

    Réponse: oui Les 8 bits inférieurs du mot d’état codent le numéro du signal, etc. les 8 bits de poids fort du mot d’état (16 bits) codent l’état de sortie.

    Voir et les macros WIFEXITED (), WEXITSTATUS (), etc.

    Je pense que ce que vous faites devrait fonctionner correctement – il suffit de renvoyer le nombre d’occurrences comme code de sortie du processus.

    Vous dites que exit () n’autorisera que les nombres inférieurs à 256. Je doute fortement que ce soit le cas, mais il serait assez simple pour vous d’écrire un programme de test pour le savoir.

    Cela ressemble vraiment à une version simplifiée de Map-Réduire . Vous voudrez peut-être aussi jeter un coup d’œil à cet algorithme pour trouver des idées sur la manière de paralléliser davantage le programme – et peut-être d’obtenir un crédit supplémentaire 🙂

    En ce qui concerne la différence entre wait () et waitpid () – si vous souhaitez simplement attendre que l’un de vos processus enfant se termine, vous devez utiliser wait (). Si vous voulez attendre uniquement pour un processus enfant spécifique ou si vous voulez simplement vérifier si un processus enfant s’est terminé sans être suspendu, vous utiliseriez waitpid ().