2017-06-27 4 views
1

Ich habe eine einfache Rohr Programm, das untergeordnete Prozesse erstellt, um einige Informationen zu schreiben und der übergeordnete Prozess wird diese Informationen angezeigt.Finden Sie die Anzahl der Prozesse

int main() { 
    int pfd[2], i, n; 
    pipe(pfd); 
    for(i=0; i<3; i++) { 
    if(fork() == 0) { 
     write(pfd[1], &i, sizeof(int)); 
     close(pfd[0]); close(pfd[1]); 
     exit(0); 
    } 
    else { 

    } 
    } 
    for(i=0; i<3; i++) { 
     wait(0); 
     read(pfd[0], &n, sizeof(int)); 
     printf("%d\n", n); 
    } 
    close(pfd[0]); close(pfd[1]); 
    return 0; 
} 

In dieser Situation erhält der Parent-Prozess folgende Ergebnisse: 0 ,1 and 2.

Wenn ich die Zeile löschen, die exit(0) enthält, wie kann ich herausfinden, wie viele Prozesse das Programm erstellt hat?

Vielen Dank im Voraus.

+1

Die Anzahl der erstellten Prozesse entspricht der Anzahl der Aufrufe von 'fork()'. Wenn Sie die 'exit (0)' -Aufrufe löschen, versuchen die Kinder, die Schleife ('fork()' wieder zu durchlaufen) und dann warten sie (0) '. Sie erhalten aus einigen ihrer 'wait()' '' ECHILD''. Ist das wirklich was du vorhast oder meinst du etwas anderes? –

+0

Ihre Frage ist sehr unklar. – Stargateur

Antwort

1

Unten ist ein Arbeitsbeispiel, das die Anzahl der erstellten Kinder verfolgt. Beachten Sie, dass fork() einen anderen Adressraum erstellt, der es Ihnen nicht erlaubt, Variablen unter Eltern/Kind zu teilen. Aber der Programmzähler wird gleich bleiben und so Eltern und Kind wird direkt nach dem Aufruf an fork() ausführen.

Wenn Sie eine fork() in einer Schleife machen, wird Ihr Kind bis zum Ende des Körpers, wenn es die Bedingung erfüllt, wird es den Körper ausführen (einschließlich der fork() wieder).

#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdio.h> 



int main() { 
    int pfd[2], i, n; 
    pid_t children_pids[3]; 
    int children_created = 0; 
    memset(children_pids, 0, sizeof(children_pids)); 

    pipe(pfd); 
    for(i=0; i<3; i++) { 
    pid_t p = fork(); 
    if(p == 0) { 
     write(pfd[1], &i, sizeof(int)); 
     close(pfd[0]); close(pfd[1]); 
     exit(0); 
//  break; 
    } 
    else { 
     children_pids[children_created++] = p; 
    } 
    } 
    for(i=0; i<3; i++) { 
     pid_t p = waitpid(children_pids[i], NULL, 0); 
     if (p == -1) { 
      /* error, but expected w/o exit() above */ 
      continue; 
     } 
     read(pfd[0], &n, sizeof(int)); 
     printf("%d\n", n); 
    } 
    close(pfd[0]); close(pfd[1]); 

    printf("Total children: %d\n", children_created); 
    return 0; 
} 
Verwandte Themen