Frage

Ich habe dieses Problem zu lösen, dass ich keine Ahnung, wie es zu tun, weil es nur ein paar Systemaufrufe ist können wir es lösen verwenden, und ich sehe nicht, wie sie für die Situation nützlich sind.

Die Aufgabe:
Ich habe Matrix mit einer Größe [10] [1000000] mit ganzen Zahlen und für jede Zeile erstelle ich einen neuen Prozess mit fork (). Die Idee eines jeden Prozesses ist durch alle Zahlen für die jeweilige Zeile zu gehen und eine bestimmte Anzahl eine Meldung über ausdrucken finden. Dies war der erste Schritt des Problems und es ist getan. Der zweite Schritt ist die Summe der Vorkommen dieser Zahl in jeder Zeile im Auftrag zu drucken. Und am Ende, die Gesamtsumme der Vorkommen dieser Zahl.

Die Anrufe:
Das System ruft ich verwenden kann, sind, wie dies in dem Dokument für diese Übung beschrieben:

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

Das Problem:
Ich habe keine Ahnung, wie es zu tun, weil der exit() Anruf erlaubt nur mir eine Zahl unter 256 zu passieren, was passiert, wenn die Anzahl der Vorkommen größer ist als diese Zahl? Wie werde ich wieder eine solche Nummer?

Ein weiteres Problem:
Ich verstehe nicht genau den Unterschied zwischen wait() und waitpid() und wie / wo man über die andere zu verwenden. Neben den man-Seiten gibt es mehr Dokumentation, wo ich Code-Beispiele sehen kann und so, sich besser zu verstehen? Oder kann jemand erklären mir die Unterschiede und bieten ein grundlegendes Beispiel solche Unterschiede zeigen?

War es hilfreich?

Lösung

Mit waitpid(), um den Exit-Status der untergeordneten Prozesse in Folge Garner; wait() mit nimmt keine Garantie über die Reihenfolge, in der die Kinderleichen abgerufen werden.

Auf Unix wird der Beendigungsstatus auf 8 Bits beschränkt ist, die behandelt werden können, wie durch das Programm mit oder ohne Vorzeichen, die Daten abruft. Sie erhalten auch einen 8-Bit-Wert, der die Signalnummer und Core-Dump-Status des beendeten Kindes zu identifizieren. AFAIK, entweder der Status oder die Signal-Bits sind immer Null (und oft beide - wenn der Prozess beendet erfolgreich).

Wenn Sie nicht wissen, dass die Zahlen zurückgeführt werden sollen, kleiner als 256 ist, dann ist Exit-Status nicht der Weg zu gehen. Wie schon andere gesagt haben, müssen Sie in diesem Fall eine andere IPC verwenden. Wenn die nur erlaubt, Systemaufrufe diejenigen sind, dann müssen Sie zu dem Schluss, dass die Werte werden weniger als 255, oder dass überläuft keine Rolle. Weder ist zufriedenstellend als Abschluss außerhalb einer Hausübung, sondern in der ‚realen Welt‘, Sie sind nicht nur 4-System beschränken entweder Anrufe.

Siehe auch Exit-Codes größer als 255? . Beachten Sie, dass unter Windows ist der Bereich von Exit-Codes ist viel größer -. Aber Sie nicht über die Systemaufrufe in der Frage aufgeführt verwenden


Beobachtung: Wenn ich exit(1) tun, ist der Wert in Status von wait() 256; gibt es einen Grund dafür?

Antwort: ja. Die niedrigen 8 Bits des Statuswortes die Signalnummer kodieren, und so weiter; der hohe 8 Bit des (16-Bit) Statuswortes des Exit-Status kodieren.

Siehe <sys/wait.h> und Makros WIFEXITED (), WEXITSTATUS (), etc.

Andere Tipps

Ich denke, was Sie tun sollen gut funktionieren - nur die Anzahl der Vorkommen als Exit-Code aus dem Prozess zurück.

Sie erwähnen, dass exit () nur Zahlen unter 256. erlaubt ich sehr bezweifeln, ob dies der Fall ist, aber es wäre einfach genug sein, dass Sie ein Testprogramm zu schreiben, um sicher zu erfahren.

Klingt wie das ist wirklich nur eine vereinfachte Version von Map-Reduce . Sie können einen Blick auf diesem Algorithmus als auch für einige Ideen haben, wollen, wie Sie das Programm weiter parallelisieren könnten - und vielleicht etwas mehr Kredit bekommen:)

Was den Unterschied zwischen wait () und waitpid () - wenn Sie nur für eine Ihrer Child-Prozesse warten möchten abzuschließen, würden Sie wait () verwenden. Wenn Sie nur für einen bestimmten untergeordneten Prozess warten wollen oder wenn Sie wollte nur prüfen, ob ein Kind-Prozess ohne hängende verlassen hat, würden Sie verwenden waitpid ().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top