2017-02-01 3 views
1
#include<stdio.h> 
#include<unistd.h> 
#include<stdlib.h> 

int main(int argc, char ** argv) 
{ 

    int pid; 
    int status; 
    pid = fork(); 

    if (pid < 0) 
    { 
     printf("Cannot create a child process"); 
     exit(1); 
    } 
    else if (pid == 0) 
    { 

     printf("I am the child process. %d \n", getpid()); 
     printf("The child process is done. \n"); 
     fflush(stdout); // it does not write immediately to a disk. 
     exit(0); 
    } 
    else 
    { 

     printf("I am the parent process.%d \n", getpid()); 
     sleep(5); // sleep does not works 
     pid = wait(&status); // want to wait until the child is complited 
     printf("The parent process is done. \n"); 
     fflush(stdout); // it does not write immediately to a disk. 
     exit(1); 
    } 
} 

Hallo Leute, ich versuche derzeit, einen Kindprozess zu erstellen. So weit, so gut, was ich jetzt versuche, ist, das Kind zuerst auszuführen und auszudrucken und immer die Nachricht "Der Elternprozess ist fertig" auszudrucken.Ausführen von Kind vor dem Eltern in C

I am the parent process.28847 
I am the child process. 28848 
The child process is done. 
The parent process is done. 

Derzeit druckt diese:

I am the parent process.28847 
The parent process is done. 
I am the child process. 28848 
The child process is done. 

Es ist mein erstes Mal Forking mit so bin ich nicht wirklich sicher, was ich tue, ich habe versucht, schlafen und warten (& Status) zu versuchen Sie zu warten, bis der Kindprozess beendet ist, und führen Sie dann den Elternprozess aus, aber etwas funktioniert nicht.

P.S. Entschuldigung für das schlechte Layout, zum ersten Mal mit stackoverflow.

+4

Sie sollten wahrscheinlich verwenden [ 'wait()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html) oder ['waitpid()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/waitpid.html). –

+3

In Ihrem Code wird "Der Elternprozess ist fertig" immer als letztes gedruckt (da Sie 'wait()' verwenden). – usr

+0

Vielen Dank, ich habe es geschafft, es zu beheben. Ich werde Mutex und Semaphore überprüfen und wie kann ich es verbessern. –

Antwort

1

Versuchen Sie waitpid (-1, NULL, 0); oder warten (NULL); Dies blockiert Eltern, bis alle untergeordneten Prozesse abgeschlossen sind. Wenn es funktioniert, müssen Sie nicht schlafen.

Geringfügige Änderungen an Ihrem Code:

else 
{ 
    int status =0; 
    printf("I am the parent process.%d \n", getpid()); 
    status= waitpid(-1, NULL, 0); // want to wait until the child is complete 
    //Also check if child process terminated properly 
    if(status==0) 
    { 
     printf("Child process terminated properly"); 
    } 
    else 
    { 
     printf("Child process terminated with error"); 
    } 

    printf("The parent process is done. \n"); 

    fflush(stdout); // it does not write immediately to a disk. 

    exit(1); 
}