2009-09-23 67 views
2

嗨我正在研究一個unix shell,我遇到了兩個問題。我想知道你們中的任何一位能否幫助我。我的第一個問題是shell不在等待子進程終止。我實際上可以在子進程運行時輸入更多的命令。我的第二個問題在於以下兩行。我沒有在shell上顯示任何內容。execv,等待,Unix編程,如何等待孩子

fprintf(stderr, "Process name is: %s\n", commandArgv[0]); 
    fprintf(stderr, "Child pid = %d\n", pid); 

我有以下方法來執行由用戶輸入的方法:即火狐,LS -a等

void execute(char *command[], char *file, int descriptor){ 
    pid_t pid; 
    pid = fork(); 

    if(pid == -1){ 
     printf("error in execute has occurred\n"); 
    } 
    if(pid == 0){   
     execvp(*command,command); 
     fprintf(stderr, "Process name is: %s\n", commandArgv[0]); 
     fprintf(stderr, "Child pid = %d\n", pid); 
     wait(&status); 
      exit(EXIT_SUCCESS); 
    } 
    else{ 
     printf("ignore for now\n"); 
    } 
} 

這是我所說的執行命令。它工作正常,並啓動一個進程,但它不會等待它完成。

execute(commandArgv, "STANDARD",0); 

你們有什麼想法我可能做錯了嗎?謝謝,我非常感謝您隨時爲我提供幫助。

+0

我在執行調用後移動了等待。這工作得很好。謝謝。 – user69514 2009-09-23 19:02:12

+0

或將其移動到代碼的「忽略現在」部分,這是父級在fork()'d後執行的部分。 – 2009-09-23 19:03:52

回答

4

一旦execvp()運行,它將永遠不會返回。它將內置的運行應用程序替換爲提供的內容。所以你的fprintf()和wait()在錯誤的地方。

+0

重新閱讀您的問題......也許您只需要調用system()來運行您的命令?或者你是否特意要fork + execvp? – 2009-09-23 18:30:09

+0

是的我需要fork然後execvp – user69514 2009-09-23 19:20:07

1

除了讓實際的邏輯正常工作(Stéphane的建議一切正常)之外,您可能還希望在fprintf-ing之後使用(stderr),以確保您的錯誤消息立刻出來而不是被緩衝。

1

你在過程的工作方式上有點小錯誤。 execvp被調用後,沒有回頭路。 fork()讓你有父母和一個完全相同的孩子,但是execvp覆蓋子圖像是你所調用的命令。

僅當發生嚴重錯誤以防止覆蓋圖像時,execvp 纔會返回。所以,你需要在打電話前打印東西。因此,您也可能希望將EXIT_SUCCESS更改爲EXIT_FAILURE

現在還有一個錯誤,使用等待:你總是希望父母等待孩子,而不是其他的方式。你不能要求孩子等待。她沒有什麼可以等待,她會跑步和終止。因此,您需要將等待()呼叫移動到其他部分。

void execute(char *command[], char *file, int descriptor) 
{ 
    pid_t pid; 
    pid = fork(); 

    if(pid == -1) 
    { 
     printf("fork() error in execute() has occurred\n"); 
     return; /* return here without running the next else statement*/ 
    } 
    if(pid == 0) 
    {   
     fprintf(stderr, "Process name is: %s\n", commandArgv[0]); 
     fprintf(stderr, "Child pid = %d\n", getpid()); 
     execvp(*command,command); 
     fprintf(stderr, "Error! Can't overwrite child's image!\n"); 
     exit(EXIT_FAILURE); 
    } 
    else 
    { 
     printf("Parent waiting for child pid: %d\n", pid); 
     wait(&status); 
     printf("Parent running again\n"); 
    } 
} 

但讀你的問題,也許你實際上不希望父母等待。如果是這樣的話,就不要使用wait()函數。

保重, 貝喬

編輯:一些小錯誤。孩子的pid是getpid()