2016-05-01 5 views
0

Ich muss den größten Wert in einem Array von 1000 Zahlen mit 10 untergeordneten Prozessen finden (so dass jeder von ihnen nur hundert Werte überprüft), und der Elternteil muss nur die Daten sammeln. Ich bin schon fertig mit der ganzen Sache, aber ich bin beim Lesen der Werte fest.Forked 10 untergeordnete Prozesse, wie kann der Elternprozess ihre Rückgabewerte sammeln?

Hier ist der Code:

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

int main(){ 
    int array[1000]; 
    int i, j; 
    int pids[10]; 
    int searchminindex; 
    int searchmaxindex; 
    int maxindex; 

    srand(time(NULL)); 

    //fill up array with random numbers 
    for(i = 0; i < 1000; i++) 
    { 
      tomb[i] = random() % 5000; 
    } 

    //create 10 child processes 
    for (i = 0; i < 10; i++) { 
      if ((pids[i] = fork()) < 0) { 
        perror("fork"); 
        abort(); 
      } 
      else if (pids[i] == 0) { 
        searchminindex = i * 100; 
        searchmaxindex = (i+1) * 100; 

        //finding the biggest value 
        maxindex = searchminindex; 
        for(j = searchminindex+1; j < maxindex; j++) { 
          if(array[maxindex] < array[j]) 
            maxindex = j; 
        } 
      } 

    } 
    for(i = 0; i < 10; i++){ 
     //here's where I'd read the return values of the subarrays 
    } 

    return 0; 
} 

Ich habe versucht, mit Rohren und auch WEXITSTATUS, aber ich bin wirklich verwirrt und weiß nicht, wo, wie, dass ein Ende des Rohres und Dinge zu schließen, und mit WEXITSTATUS bin ich komplett verloren.

Wie können Sie helfen?

+0

Multi t Überschrift wäre eine bessere Option –

+2

Sind Sie gegen die Verwendung von Threads dafür? Es würde die Dinge ein wenig leichter machen. –

+0

Könnten Sie ein globales Array pidsresults [10] hinzufügen und dann jedes pids sein Ergebnis in einen eigenen Index setzen? – zipzit

Antwort

0

Sie müssen die von fork zurückgegebene PID testen und den Code so verzweigen, dass Ihr Hauptprozess sich nicht wie ein Kind verhält und Ihre Kinder keine eigenen Kinder spawnen. Sobald das erledigt ist ...

-Sharing-Speicher zwischen gegabelten Prozessen wird gut erklärt here

würde ich mmap verwenden, um Shared Memory zwischen den Prozessen zu erstellen, müssen Sie für jeden Prozess angeben, wo setzt es Ergebnis, dann verwenden Sie wait, um festzustellen, wann alle Kinder beendet wurden, und ein gutes Programm würde den Beendigungsstatus auswerten und den Benutzer informieren, wenn ein Kind abnormal beendet wurde.

Vergessen Sie nicht, den gemeinsam genutzten Speicher zu bereinigen, bevor der Parent-Exit beendet wird.

+0

Nichts für ungut, aber das Einrichten von SHM, um einfach 10 mal einen Wert zwischen 0 und 100 zurückzugeben, scheint ruhig etwas Anstrengung zu sein ... ;-) – alk

+0

Einverstanden. Die Verwendung von fork anstelle von multi-threading ist ebenfalls übertrieben, aber dies ist eine akademische Übung, kein Optimierungsproblem für den Produktionscode. – Jfevold

0

Sie müssen die von fork zurückgegebene PID testen und den Code so verzweigen, dass Ihr Hauptprozess sich nicht wie ein Kind verhält und Ihre Kinder keine eigenen Kinder spawnen. Sobald das erledigt ist ...

Eine Alternative zu mmap oder Einrichten von Shared Memory überhaupt ist, WEXITSTATUS zu verwenden. Laut der man-Seite gibt es nur die niedrigstwertigen 8 Bits zurück. Wenn Ihre Rückgabewerte also größer als 127 sein können, ist dies wahrscheinlich nicht Ihre beste Option. Kann gemacht werden, um bis zu 255 zu arbeiten, aber sei vorsichtig mit der Signiertheit von Char, das ist kein Standard.

int returned_values[10]; 
for(int i = 0; i < 10; ++i) 
{ 
    int status; 
    wait(&status); 
    if(WIFEXITED(status)) 
     returned_values[i] = WEXITSTATUS(status); 
    else { 
     //Do something more meaningful here 
     //This means a child received a signal, or any of the other ways wait returns other than a child exiting. 
     --i; 
    } 
+0

Das würde funktionieren, aber leider kann der Rückgabewert höher als 127 oder sogar 255 sein. – Preno

+0

@Preno dann bitte überlege meine andere Antwort. – Jfevold

Verwandte Themen