2017-10-28 6 views
0

Blick auf this post Ich verstehe nicht Kaylums Antwort. Ich habe zwei Fragen.Abrufen der Gesamtmenge der Prozesse von einem fork() Aufruf mit WEXITSTATUS

1) Er/Sie möchte die Variable "count" verwenden, um die Gesamtzahl der provozierten Prozesse (dh die Gesamtzahl der Kinder, Enkel usw. + Originalprozess) von einer Verzweigung zu zählen. Ich sehe, dass er beginnt, indem er im Elternprozess count auf 1 setzt, was Sinn macht (um den Eltern zu zählen), aber dann setzt er Count in den Kindern wieder auf 1. Warum macht das Sinn? Count ist bereits auf eins gesetzt und dies setzt die Anzahl nur noch einmal auf 1.

count += WEXITSTATUS(status); 

2) Ich habe WEXITSTATUS untersucht, und von dem, was ich sammeln kann es den Exit-Status eines Prozesses durch den Ausgang zurück. Meine Frage ist, kann ich

exit(0) 

oder

exit(1) 

oder etwas anderes für sie arbeiten zu verwenden. Die Dokumentation dafür ist nicht klar. Mit anderen Worten, um es als Kaylum des

Vollcodesegment hier für Bequemlichkeit zu arbeiten:

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

int main(void) 
{ 
    pid_t before_pid, after_pid; 
    pid_t forked_pid; 
    int count; 
    int i; 
    int status; 

    before_pid = getpid(); 
    count = 1; /* count self */ 
    for (i = 0; i < 3; i++) { 
     forked_pid = fork(); 

     if (forked_pid > 0) { 
      waitpid(forked_pid, &status, 0); 
      /* parent process - count child and descendents */ 
      count += WEXITSTATUS(status); 
    } else { 
     /* Child process - init with self count */ 
     count = 1; 
    } 
} 

after_pid = getpid(); 
if (after_pid == before_pid) { 
    printf("%d processes created\n", count); 
} 

return (count); 
} 
+0

Kaylums Lösung sollte funktionieren, aber es ist auf 255 in der Zählung begrenzt: Der maximale Wert des Exit-Codes ist 255. – benjarobin

+0

Vielen Dank. Ich hab es jetzt. Ich weiß, dass es auf 255 begrenzt ist, was in Ordnung ist. Ich schätze den Input. – EFiore

Antwort

1

ich sehe, dass sie/er beginnt nach Zählung 1 in dem übergeordneten Prozess Einstellung, den Sinn macht (um den Elternteil zu zählen), aber dann setzt er in den Kindern wieder auf 1. Warum macht das Sinn? Count ist bereits auf eins gesetzt und dies setzt die Anzahl nur noch einmal auf 1.

Andernfalls jedes Kind Prozess in der Schleife erstellt könnte einen count Wert größer als 1 hat. Denken Sie daran, fork() dupliziert einen Prozess von seinem aktuellen Zustand. Also für jede gegebene fork() in der Schleife, count ist nicht unbedingt 1. Wenn Sie den Wert von count im else Teil drucken, können Sie dies leicht verstehen.

Ich habe WEXITSTATUS untersucht und von dem, was ich sammeln kann, gibt es den Exit-Status eines Prozesses durch Exit zurück. Meine Frage ist, muss ich exit (0) oder exit (1) verwenden?

Das ist, was return(count) von tut. Die Rückkehr von der Hauptleitung ist äquivalent zum Anruf , d. H. exit(count);.

Beachten Sie, dass this answer den Zählerstand durch exit() Status überschreitet. Der Wert exit status ist historisch auf einen 8-Bit-Wert begrenzt. Es funktioniert also möglicherweise nicht wie erwartet für einen Wert von i größer als 8 auf den meisten Plattformen.

+0

Danke. Ich verstehe jetzt. Ich schätze das Feedback. – EFiore

+1

Wenn diese Antwort Ihnen geholfen hat, [akzeptieren Sie sie] (https://meta.stackexchange.com/q/5234/362103). Viel Glück! – usr

Verwandte Themen