2009-04-21 10 views
0

J'ai ce problème à résoudre que je n'ai aucune idée de comment le faire parce qu'il y a seulement quelques appels système que nous pouvons utiliser pour le résoudre et je ne vois pas comment ils sont utile pour la situation.Utilisation correcte de fork, wait, exit, etc

l'exercice:
Je matrice de taille [10] [1000000] avec des nombres entiers, et pour chaque ligne de créer un nouveau processus avec fork(). L'idée de chaque processus est de parcourir tous les numéros pour cette ligne spécifique et de trouver 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 ordre. Et à la fin, le grand total des occurrences de ce nombre.

Les appels:
Les appels système que je peux utiliser sont décrits comme celui-ci dans le document pour 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 parce que le seul appel exit() me permet de passer un nombre inférieur à 256, si le nombre d'occurrences est plus grand que ce nombre? Comment dois-je retourner un tel numéro?

Un autre problème:
Je ne comprends pas exactement la différence entre wait() et waitpid() et comment/où utiliser l'un sur l'autre. Outre les pages de manuel, existe-t-il d'autres documents dans lesquels je peux voir des exemples de code et ainsi mieux les comprendre? Ou quelqu'un peut-il m'expliquer les différences et fournir un exemple de base démontrant de telles différences?

+0

entrée de l'échantillon et la sortie s'il vous plaît. Prenez un tableau de dimensions 3x5, où 3 = non de lignes, 5 = non d'entiers pour la brièveté. – dirkgently

+0

Si vous avez besoin de communiquer entre les processus et que vous ne pouvez pas utiliser les codes de sortie, vous devrez étudier une autre forme d'IPC. Considérez les tuyaux (peut-être via popen). – dmckee

+0

Pouvez-vous écrire les numéros dans un fichier, ou pouvez-vous communiquer entre les processus en utilisant STDIN/OUT? – Terry

Répondre

4

Utilisez waitpid() pour obtenir les états de sortie des processus enfants en séquence; L'utilisation de wait() ne garantit pas l'ordre dans lequel les corps d'enfants seront récupérés.Sur Unix, l'état de sortie est limité à 8 bits, ce qui peut être considéré comme signé ou non par le programme qui récupère les données. Vous obtenez également une valeur de 8 bits identifiant le numéro de signal et l'état de vidage de l'enfant terminé. AFAIK, soit le statut ou les bits de signal sont toujours zéro (et souvent les deux - quand le processus se termine avec succès).

Si vous ne savez pas que les nombres à renvoyer sont inférieurs à 256, l'état de sortie n'est pas le bon choix. 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, alors vous devez conclure que les valeurs seront inférieures à 255, ou que les débordements n'ont pas d'importance. Ni l'un ni l'autre n'est satisfaisant en tant que conclusion en dehors d'un exercice de devoirs, mais dans le «monde réel», vous n'êtes pas limité à seulement 4 appels système.

Voir également Exit codes bigger than 255?. Notez que sous Windows, la plage de codes de sortie est beaucoup plus grande, mais vous n'utilisez pas les appels système répertoriés dans la question.


Observation: quand je fais exit(1), la valeur à l'état 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 de signal et ainsi de suite; les 8 bits supérieurs du mot d'état (16 bits) codent l'état de sortie.

Voir <sys/wait.h> et macros WIFEXITED(), WEXITSTATUS(), etc.

+1

Je vais devoir demander à l'enseignant ce qu'il veut faire ... Une chose cependant, comme je l'ai dit dans un autre commentaire si je fais sortie (1), sortie (2), sortie (4) la valeur d'attente (statut int) sera effectivement de 256, 512, 1024 respectivement, une raison pour cela? –

1

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 indiquez 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-Reduce. Vous voudrez peut-être jeter un coup d'œil à cet algorithme pour trouver des idées sur la façon dont vous pourriez paralléliser le programme - et peut-être obtenir un crédit supplémentaire :)

En ce qui concerne la différence entre wait() et waitpid() - si vous voulez juste attendre que l'un de vos processus fils soit terminé, vous utiliseriez wait(). Si vous voulez attendre seulement un processus enfant spécifique ou si vous voulez juste vérifier si un processus enfant s'est terminé sans être suspendu, vous utiliserez waitpid().

+0

Sur Unix, le questionneur est correct - le statut de sortie est une valeur de 8 bits (qui est parfois traitée comme signée et parfois traitée comme non signée, selon le programme). –

+0

Oui, juste cherché sur Google et différentes pages rapportées la même chose, je ne peux que retourner les valeurs de 0-255 et je viens de tester cela et pour une raison quelconque, si je revenais 1, il a effectivement retourné 256, 2 = 512, 4 = 1024 , je ne sais pas pourquoi ... De plus, il n'y a pas de crédits du tout à gagner, j'ai besoin de savoir et de comprendre comment cela fonctionne pour l'examen final dans quelques semaines qui aura des questions similaires. –

+0

@Jonathan - intéressant sur les codes de statut 8 bits. En supposant cette limitation, je ne peux pas penser à un autre moyen de passer l'information de l'enfant au processus parent dans les limites du problème. –