2009-02-28 3 views
0

Angenommen, alle Variablen wurden zuvor deklariert ... weil sie es waren. Der Kindprozess druckt nichts, was mich glauben lässt, dass er nicht ausgeführt wird. Der Parent-Prozess wird ordnungsgemäß ausgeführt, obwohl er nicht den gemeinsamen Speicher erhält. I für die Länge dieses Codes entschuldigen ...Warum verarbeitet das Kind hier nichts?

// create 5 child process 
for(int k=0;k<5;k++){ 

    // fork a child process 
    pid = fork(); 

    // error occured on fork 
    if (pid < 0) { 
     fprintf(stderr, "Fork Failed"); 
     return 1; 
    } 
    // this is what the child process will run 
    else if (pid == 0) { 
     //create a shared mem segment 
     segment_id = shmget(IPC_PRIVATE, size, S_IRUSR | S_IWUSR); 

     //attach the shared memory segment 
     shared_memory = (char *) shmat(segment_id, NULL, 0); 

     printf("this is child"); 

     double x = 0; 
     double sum = 0; 

     // Run process that sums the function 
     for(int i=0; i<n; i++){ 
      // get random number in range of x1-x2 
      x = rand()%(x2 - x1 + 1) + x1; 
      sum = sum + f(x); 
     } 

     //write output to the shared memory segment 
     sprintf(shared_memory, "%f", sum); 
     execlp("/bin/ls", "ls", NULL); 

    } 

    // this is what the parent process will run 
    else { 

     //print output from shared memory 
     printf("\n*%s", shared_memory); 

     //detach shared memory 
     shmdt(shared_memory); 

     //Here we add the shared memory to the array 
     // To add together at the end 
     // but since I cant get the memory to share 
     // the array can't be implemented 

     //remove the shared memory segment 
     shmctl(segment_id, IPC_RMID, NULL); 

     wait(NULL); 
    } 
} // End of for statement 
+0

Sie suchen nicht nach Fehlerbedingungen bei den shm * -Operationen. –

Antwort

10

Der C stdout Strom intern puffert Daten. Es ist wahrscheinlich, dass Ihre Nachricht "this is child" gepuffert ist und der Puffer nicht von execlp geleert wird. Er verschwindet also einfach. Probieren Sie einen fflush (stdout); nach dem Druck Übrigens sollten Sie dies auch vor dem fork() tun, damit Kind und Eltern nicht versuchen, die Ausgabe vor der Verzweigung gepuffert zu schreiben.

+0

Doppelt wahrscheinlich das Problem, da die gedruckte Ausgabe keine Zeilenschaltung enthält. Wenn die Ausgabe liniengepuffert war, würde der Zeilenumbruch die Daten erzwingen. –

+0

Das ist auch ein guter Grund, um die Diagnose auf stderr zu drucken - sie wird nicht gepuffert und geht nicht so leicht verloren. –

+0

Ich habe das versucht, aber es funktioniert nicht für mich. Ich benutze 'fflush (stdout);' aber immer noch Child Prozess nichts drucken. Haben wir irgendeinen Weg, aus dem wir herausfinden können, "welcher gerade läuft (derzeit bedient von Prozessor Kind oder Elternteil)" – Merom

-1

Löschen Sie zuerst alle freigegebenen Speicher und sehen Sie, ob der untergeordnete Prozess dann erfolgreich gedruckt werden kann.

Mit dem Aussehen dieses Snippets initialisieren Sie shared_memory im untergeordneten Prozess, aber nicht im übergeordneten Prozess.

3

Druck auf stderr ist nicht gepuffert.

fprintf(stderr,"Plop\n"); 

Auch das Shared-Memory-Material (segment_id, shared_memory) in der Mutter nicht initialisiert (oder wenn es es ist dann nicht das gleiche ist wie das Kind).

Darüber hinaus zerstört das übergeordnete Element möglicherweise das Shared Memory-Zeug, während das Kind noch verarbeitet wird. Der Elternteil sollte zuerst warten und dann die vom Kind erzeugten Daten verarbeiten.