2013-04-07 35 views
0

所以我想在我用叉子複製一個單獨的子進程來執行的wget如下:EXECL與wget的,子進程,UNIX - 爲什麼它不工作

int child; 
    pid_t child = fork(); 
if (child == 0) { // no errors 
    bool done = false; // set to false 
    while (!done) { // while not true do 
    execl("wget", "someurl", NULL); 
    done = true; // since dl finished 
} 
cout << "DL Finished\n"; // to see if child was successful 
} 
else if (child != 0) { // errors 

任何明顯的錯誤,你可以在這個代碼中指出?如果它很重要,這是一個無效函數,我打電話在主要發生的是,它不是下載,它顯示「DL成品」,但是執行wget - 然後終端接管。

這是在Ubuntu 12.04.2 LTS上執行的。我以前在裏面使用相同的void函數來執行「ls」,它可以正常工作,也就是我告訴它ls(/ bin/ls)的整個路徑。我讀到沒有提供完整的路徑將使它搜索命令,這是我想要的。

+0

嘗試在exec調用中使用wget的完整路徑。 – suspectus 2013-04-07 10:45:36

+0

當'fork'返回非零時,它不一定是錯誤。大多數時候它是新的子進程的進程ID。 – 2013-04-07 10:46:55

回答

2

我讀不提供完整的路徑將使搜索 命令

那天正好爲execlp。另外,按照慣例,第一個參數應該是可執行文件的名稱。所以,你可以嘗試:

execlp("wget", "wget", "someurl", NULL); 
    ^  ^^^^^ 

作爲一個側面說明,你的while (!done)是錯誤的。這不是你如何等待節目完成。事實上,一旦您撥打execwhile就消失了:另一個進程「替換」自己的進程。所以你可以想到它「exec是一個不返回的函數」。標準方法是在母公司中wait(2),直到孩子死亡。


作爲第二個側面說明,如果你想要的是wget東西,等到wget完成後,system(3)可能是比較合適的:

system("wget someurl"); 
+0

你是對的,謝謝!至於(完成),你有什麼提示/建議如何使它等待下載完成? (一旦我被允許,將作爲答案添加) – dusz 2013-04-07 10:46:51

+0

@dusz不要將它標記爲已被接受!等一下,也許更好的答案出現。 – cnicutar 2013-04-07 10:47:45

+0

我會等一會兒,因爲你建議:) – dusz 2013-04-07 10:56:08

1

傳遞給execl是參數將argv陣列添加到新進程main函數中。正如你所知,argv中的第一項是程序名稱本身。

所以,你需要做的是:

execlp("wget", "wget", "someurl", NULL); 

而且,如果一切順利的exec家庭的功能沒有恢復,所以exec調用之後的任何代碼將不會運行。

相關問題