2016-11-11 5 views
0

[Gelöst] Also für diese Übung, die ich zugewiesen wurde üben wir Prozesskontrolle. Ich wundere mich einfach, warum es scheint, dass mein Kindprozess nie ausgeführt wird (wenn child_pid == 0). Jede Hilfe zu diesem Thema würde sehr geschätzt werden! Auch safe_fork() ist eine Funktion, die unser Lehrer geschrieben hat, um zu vermeiden, dass Schüler zu viele Prozesse öffnen.C - Child Prozess nicht ausgeführt

#include "safe-fork.h" 
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/types.h> 

int main(void) { 

    pid_t child_pid; 
    int pipefd[2]; 
    int pipe_result; 
    int count; 

    pipe_result = pipe(pipefd); 

    if (pipe_result == -1) { 
    perror("pipe failure"); 
    exit(1); 
    } 

    child_pid = safe_fork(); 

    /*Parent Process*/ 
    if (child_pid > 0) { 
    dup2(pipefd[0], STDIN_FILENO); 
    scanf("%d", &count); 

    if (count > 200) { 
     printf("Long enough!\n"); 
     exit(0); 
    } 
    else { 
     printf("Too short!\n"); 
     exit(1); 
    } 

    } 
    /* Child Process */ 
    else { 
    dup2(pipefd[1], STDOUT_FILENO); 
    execl("/usr/bin/wc", "-w"); 
    } 
    return 0; 
} 
+0

Wenn Sie eine der 'scanf()' -Familien von Funktionen aufrufen, überprüfen Sie immer den zurückgegebenen Wert (nicht die Parameterwerte), um sicherzustellen, dass der Vorgang erfolgreich war. Beim Aufruf einer der 'exec()' -Familien von Funktionen kehren sie nur zurück, wenn ein Fehler aufgetreten ist, also folgen Sie dem Aufruf mit: 'perror (" exec ?? failed "); exit (1); ' – user3629249

+0

Der Elternprozess sollte' waitpid (child_pid, NULL) aufrufen; Vor der Rückkehr. Im aktuellen Szenario wird das Kind nie zurückkehren, da keine Datei/Eingabe an die "wc" -Funktion übergeben wird, so dass es für immer bei stdin sitzen bleibt, für die Eingabe.Schlagen Sie vor, einen weiteren Parameter hinzuzufügen, bei dem es sich um den Namen einer Datei handelt, deren Wörter gezählt werden sollen. Hinweis: Parameterlisten zu 'execl()' sollten mit einem NULL-Parameter enden. Hinweis: Wenn der Elternprozess beendet wird, wird der untergeordnete Prozess (falls er nicht bereits beendet wurde, was in diesem Szenario nicht beendet wurde) in einen "Zombie" -Prozess umgewandelt, der einen Neustart erfordert. – user3629249

+0

Beim Aufrufen von 'fork()' gibt es drei Rückgabewerte, nicht nur zwei (I.E. -1 bei Fehler) Der Code muss den Rückgabewert -1 ordnungsgemäß verarbeiten. – user3629249

Antwort

3

Hier ist ein Vorschlag, 0 explizit für child_pid == überprüfen Ursache es auch den Fall, dass Ihre safe_fork() Funktion ist fehlgeschlagen sein könnte, überprüfen Sie auch für diese Fehler, dh child_pid < 0. debug printf Aussagen hinzufügen Überprüfen Sie den Kontrollfluss, wenn Sie dies noch nicht getan haben, und prüfen Sie schließlich, ob der execl-Aufruf fehlgeschlagen ist.

Schauen Sie sich auch diese tutorial zum Erstellen von Pipes in C und verwenden Sie sie für die Kommunikation zwischen einem übergeordneten und einem untergeordneten Prozess. Wie ich finde, gibt es einige Probleme mit dem Umgang mit diesen Dateideskriptoren. Ein möglicher Grund, dass Sie keine Ausgabe sehen können, ist, dass wc möglicherweise noch auf eine Eingabe wartet.

Und noch etwas, was Sie warten müssen, bis der Kindprozess abgeschlossen ist/etwas Nützliches getan hat oder tatsächlich ausgeführt wurde, bevor nach seiner Ausgabe gesucht wird. Überprüfen Sie die anderen Probleme zuerst, bevor Sie sich darüber Gedanken machen.

Hoffe dies Hilft :)

0

Ja, aber nein. Zuerst sollten Sie die Bedeutung von fork() genau verstehen.
fork(): erstellt einen untergeordneten Prozess und kehrt in ZWEI PROZESSE mit jeweils unterschiedlichem Rückgabewert zurück. Im übergeordneten Element wird immer die Nummer zurückgegeben, die das Betriebssystem für die Prozess-ID des neu erstellten Kindes vergeben hat. Gleichzeitig wird auch das neu erstellte Kind zurückgegeben, da der untergeordnete Prozess den Code startet, der nach der Anweisung fork() vom übergeordneten Element kopiert wurde. Im untergeordneten fork gibt immer Null zurück. Nach einem fork() - Systemaufruf suchen die Benutzer normalerweise nach dem zurückgegebenen Wert durch fork, um den untergeordneten Prozess und den übergeordneten Prozess zu unterscheiden.

Insbesondere in diesem Fall gibt es nach einem fork() zwei Prozesse mit demselben Code und demselben Programmstatus (außer beide haben unterschiedliche Werte in der Variablen child_pid). Im Elternteil ist es ein Wert ungleich Null (der der PID von Kind entspricht) und in Kind, es ist der Wert Null, da die Gabel im Kind Null zurückgibt. Nun werden beiden Prozesse ausführen

if (child_pid > 0) 

die nur für Eltern wahr ist, so übergeordneter Prozess in ‚wenn Block‘ fließen wird und ist für ein Kind falsch, so dass es direkt zu anderem Teil springen und den anderen Block ausgeführt werden.

Was ist, wenn child_process id null ist?
OS wird immer einen Wert ungleich Null für ein Kind zuweisen, so dass fork() funktioniert. Und wenn Sie die Prozess-ID "kind" als null erhalten haben, wird parent nicht in "if block" eingeben und else-Block ausführen, der dem untergeordneten entspricht.

Verwandte Themen