2016-07-30 19 views
-2

問題是我調用了fork(),並且在那裏我調用了exec兩次,一次是在父進程中,一次是在子進程中..我只是想出了通過創建更多子元素多次調用exec的新想法..但是會發生什麼情況是隻有第一個父和子元素調用exec,其餘元素只是被忽略 現在我明白,一旦一個exec被調用,你就不會回來,但我對運行多個高管有這種好奇心,有什麼辦法可以做到這一點? BTW我曾嘗試創建一個子和第一父外母,但產量仍然是相同的可以在fork()中調用exec()多少次

#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

如果沒有出錯,那麼'exec'函數都不會返回。所以你只能稱它一次。一旦你成功地調用了一個'exec'函數,你的代碼就被替換了,並且'exec'調用後的任何代碼都不會運行。 –

+1

「我明白,一旦被稱爲高管,你就不會回來」。所以你明白你不能按照你想要執行的代碼來調用'exec',對吧? – rici

+1

據我所知,在基於UNIX的系統中創建一個新進程的唯一方法是調用fork(),而不會進入正在處理線程的複雜問題。一旦某個exec函數被調用,該子程序將被執行的程序替換,因此分叉子程序中的任何後續指令都不會執行。 –

回答

0

正如你所說,exec從不返回(除非它失敗),這樣的代碼來創建第二個孩子從不執行。

你可以有家長來電fork一些多次,並有每個孩子的呼叫exec,再有父通話exec

或者,父母可以調用fork後跟exec,孩子也可以這樣做,因此它會創建另一個孩子,依此類推。當您創建了足夠的流程時,最後一位子女呼叫exec而不致致電fork停止鏈。

+0

是的,我現在明白非常感謝你 –