2012-06-18 25 views
1

AFAICS,子進程從fork()父進程繼承stdout/stdin。這讓我想知道爲什麼下面的代碼不起作用:fork()後execv()的回聲問題

int main(int argc, char *argv[]) 
{ 
    char *earg[] = {"echo", "Hello", NULL}; 

    if(fork() == 0) { 
     printf("running echo...\n"); 
     execv("echo", earg); 
     printf("done!\n"); 
     exit(0); 
    } else { 
     sleep(2); 
    } 

    return 0; 
} 

當運行這個小程序,兩個printf()的調用會在控制檯上就好了。但是,呼籲回聲不知何故會丟失!控制檯上的輸出只是:

running echo... 
done! 

有人可以向我解釋爲什麼echo輸出沒有出現在控制檯上?我該如何解決這個問題?

回答

1

execv不會搜索在PATH echo命令,所以它失敗,它打印出"done"(如果execv成功應該不會發生)。您必須提供execv的全部路徑才能工作

您可能希望改用execvp。它將搜索PATH變量中的echo命令。

+0

非常感謝!這解決了問題。 – Andreas

3

由於您的printf("done")被調用,您的execv()明顯失敗。所有exec()函數只會在發生錯誤時返回。評估errno應該可以幫助你找出失敗的原因。

嘗試使用到echo整個路徑:

execv("/bin/echo", earg); 

編輯:如果你想盡快離開孩子打印done你應該添加一個wait(NULL)調用你的父母。請參閱wait()的手冊頁以獲取更多信息以及如何使用它的示例。