2016-07-30 24 views
-2

Da ist ein Problem, dass ich fork() aufrufen und dass ich exec zweimal, einmal im Elternteil und einmal im Kind..i nur anrufe kam mit dieser neuen Idee von exec mehrere Male aufrufen, indem Sie mehr childs..aber was passiert ist, dass nur der erste Elternteil und Kind Exec aufrufen, der Rest wird einfach ignoriert Jetzt verstehe ich, dass, sobald ein Exec aufgerufen wird Sie nicht wiederkommen , aber ich habe diese Neugierde, mehrere Execs laufen zu lassen. Gibt es irgendeine Möglichkeit, dies zu tun? btw habe ich versuche, ein Kind und ein Elternteil außerhalb des ersten Elternteil zu schaffen, aber der Ausgang war immer noch die gleichenWie oft kann die exec() in fork() aufgerufen werden

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

int main(int argc,char* argv[]) 
{ 
    pid_t parent=fork(); 
    if (parent>0) 
    { 
     printf("This is the parent \n"); 
     execl("/home/desertstorm/OS/Final/Exec_Calls/exec1.out","./exec1.out",argv[1],argv[2],argv[3],NULL); 
     wait(NULL); 
     if (parent<0) 
     printf("Fork failed\n"); 
     pid_t child=fork(); 
     if (child>0) 
     { 
      printf("This is the second parent\n"); 
      execl("/home/desertstorm/OS/Final/Exec_Calls/exec3.out","./exec3.out",argv[1],argv[2],argv[3],NULL); 
      wait(NULL); 
      pid_t child1=fork(); 
      if (child1>0) 
      { 
       printf("This is the third parent\n"); 
       execl("/home/desertstorm/OS/Final/Exec_Calls/exec1.out","./exec1.out",argv[1],argv[2],argv[3],NULL); 
       wait(NULL); 
      } 
      if (child1==0) 
       { 
        printf("This is the third child\n"); 
        execl("/home/desertstorm/OS/Final/Exec_Calls/exec4.out","./exec4.out",argv[4],argv[5],argv[6],NULL); 
       } 
    if (parent==0) 
    { 
     printf("This is the child\n"); 
     execl("/home/desertstorm/OS/Final/Exec_Calls/exec2.out","./exec2.out",argv[4],argv[5],argv[6],NULL); 
    } 
     } 
     if (child==0) 
     { 
      printf("This is the second child\n"); 
      execl("/home/desertstorm/OS/Final/Exec_Calls/exec4.out","./exec4.out",argv[4],argv[5],argv[6],NULL); 
     } 
    } 

    return 0; 
} 
+1

Wenn nichts schief geht, kehrt keine der 'exec'-Funktionen zurück. Du kannst es also nur einmal anrufen. Sobald Sie eine 'exec'-Funktion erfolgreich aufrufen, wird Ihr Code ersetzt und der Code, den Sie nach dem' exec'-Aufruf haben, wird nicht ausgeführt. –

+1

"Ich verstehe, dass, sobald ein Exec gerufen wird, Sie nicht zurückkommen". Sie verstehen also, dass Sie dem Aufruf von 'exec' mit Code, den Sie ausführen möchten, nicht folgen können, oder? – rici

+1

Soweit ich weiß, ist die einzige Möglichkeit einen neuen Prozess zu erstellen (ohne in die Feinheiten von Threads zu verfallen, die auch Prozesse sind) in UNIX-basierten Systemen ist das Aufrufen von fork(). Sobald eine der exec-Funktionen aufgerufen wird, wird das Kind durch das Programm ersetzt, das ausgeführt wird, so dass jede nachfolgende Anweisung in dem verzweigten Kind nicht ausgeführt wird. –

Antwort

0

Wie Sie sagten, die exec nie zurückgibt (es sei denn, es nicht), so dass der Code der erstellen zweites Kind wird nie ausgeführt.

Sie könnten den übergeordneten Anruf fork einige Male haben, und jedes Kind exec anrufen, und dann den übergeordneten Anruf haben exec.

Alternativ kann das übergeordnete Element fork gefolgt von exec aufrufen, und das untergeordnete Element kann dasselbe tun, sodass es ein anderes untergeordnetes Element erstellt und so weiter. Wenn Sie genügend Prozesse erstellt haben, ruft das letzte untergeordnete Objekt exec auf, ohne dass fork aufgerufen wird, um die Kette zu stoppen.

+0

ja ich verstehe jetzt vielen dank –