2017-01-17 3 views
0

Ich habe den folgenden Code:C - Programm beendet (fork() und exec())

int main(int argc, char **argv) 
{ 
    char *program; 
    char  stringa[1000] = ""; 
    int num = 123; 
    char snum[5]; 

    program = argv[1]; 

    sprintf(stringa, "./%s", program); 

    pid_t pid = fork(); 
    if (pid < 0) { 
     perror("fork failed."); 
     exit(1); } 

    else if (pid == 0) { 
     char* args[] = {stringa, NULL}; 
     execv(args[0], args); 
    } 

    else { 
     char procmon_str[] = "./procmon "; 
     num = pid; 
     sprintf(snum, "%d",num); 
     printf("PID of child is %s", snum); 

     char* args2[] = {procmon_str, snum, NULL}; 
     execv(args2[0], args2); 

     sleep(20); 
     kill(num, SIGTERM); 

     sleep(2); 
     int parent_pid = getpid(); 
     printf("PID of parent is %d", parent_pid); 
     kill(parent_pid, SIGTERM); 

    } 

    wait(NULL); 

    return 0; 
} 

Die Idee ist, mit dem Programm mit 1 Befehlszeilenargument zu nennen, die einen Namen eines anderen kompilierte C ist Programm im selben Ordner. Ich möchte dieses Programm aus dem C-Code (daher die Verwendung von fork()) ausführen, und gleichzeitig möchte ich ein anderes Programm aus dem parent Teil der fork() starten.

Der Teil, der perfekt in dem child Teil fork() Werke ist, aber wenn ich es durch die Schale laufen, sagt er Terminated direkt nach und führen Sie den Code nicht in dem parent Teil der fork().

Warum ist das?

+1

Sie warten nicht, bis das Kind mit 'wait()' fertig ist. Der Platz am Ende von './Procmon' verhindert, dass das Programm ausgeführt wird. – Barmar

+0

'execv()' kehrt normalerweise nicht zurück, weil es den aktuellen Prozess durch das Programm ersetzt, das Sie ausführen möchten. Wenn es zurückkommt, heißt das, dass es einen Fehler bekommen hat, also sollten Sie die Fehlermeldung mit 'perror()' ausdrucken. – Barmar

+0

Wenn das Programm richtig funktioniert, werden alle Sachen, die Sie nach 'execv' im Elternteil haben, niemals ausgeführt. Sie sollten es zuerst setzen. – Barmar

Antwort

1
  1. Ihr Programmanruf fork(). Jetzt läuft die Ausführung des Elternprozesses und des Kindprozesses parallel ab.

  2. Das Kind:

    • Baut das Argument Array args[].
    • Ruft execv() auf und wird durch das als Argument übergebene Programm ersetzt.
  3. Der Elternteil, mit dem Kind in parallel:

    • Baut das Argument Array args2[].
    • Anrufe execv() und wird durch ./procmon ersetzt.

Der Code von sleep(20) an in nicht erreicht, es sei denn die execv() fehlschlägt (die Sie nicht überprüfen).

Lesen Sie erneut die Manualseite für fork() und wiederholen Sie die Logik des Programms.

+0

Wie kann ich erreichen, dass das Programm diesen Code erreicht? – gambit20088

+0

Den Code für den Eltern nicht in ein 'else {...}' wickeln - es ist nutzlos. Im Code für das übergeordnete _first_ warten auf das Kind zu beenden, und nur _afterwards _ 'execv()' aufrufen. – AlexP

+0

Ich denke, es war nicht klar aus meiner Frage (sorry), aber ich muss sicherstellen, dass sowohl das Kind als auch Elternteile gleichzeitig laufen. Der Prozess, der im übergeordneten Teil ausgeführt wird, verwendet die 'pid' des Prozesses, der vom untergeordneten Teil ausgeführt wird. – gambit20088

Verwandte Themen