2011-04-21 11 views
2

在windows API創建過程中我們有CreateProcess函數。爲什麼同樣的作品在windows上並不適用於unix?

現在讓我們考慮我們想要創建進程並運行DIR /X命令。當然,在Windows中不存在可執行文件DIR.exe,我們不能將它傳遞給CreateProcess。那麼該怎麼辦?

解決這個問題很簡單。我們只需要通過cmd /C "DIR /X"(作爲第二個參數)到CreateProcess

現在讓我們嘗試在unix中執行相同的操作(不是DIR /X,而是ls | wc)。

在unix中,我將使用fork + execvp來創建新進程並執行該命令。爲什麼我想要我的命令是ls | wc,因爲在unix中,單個命令(如lsgrep,ps)是可執行文件,可以單獨傳遞給exec(即不作爲參數sh,bash,...)。

因此,我們似乎可以通過"ls | wc"作爲sh的參數。 (即,我們可以標記sh -c "ls | wc"並將它們傳遞給execvp)。但是Oooops,這不起作用!

char *arg[] = {"sh", "-c", "\"ls | wc\"", NULL}; 
execvp(arg[0], arg); 

所以問題。我該如何解決這個問題?

P.S. 在Windows中如果安裝了cygwin cmd /C "ls | wc"的作品。

+0

避免編輯您的問題,使現有的答案是這樣的錯誤。事實之後,它會造成一個令人困惑的閱讀。當然,不要編輯現有的答案來匹配修改後的問題。 – 2011-04-21 14:05:51

回答

1

得到的參數去掉引號來SH:

char *arg[] = {"sh", "-c", "ls | wc", NULL}; 
execvp(arg[0], arg); 
+0

沒有區別。這沒有幫助。我也試過這個變種'char * arg [] = {「sh」,「-c」,「ls」,「|」,「wc」};'但結果相同。 – 2011-04-21 12:48:38

+0

我跑這個,它的工作... – 2011-04-21 12:49:16

+0

http://ideone.com/fRdK7 – 2011-04-21 12:51:08

2

你不需要逃脫\",這應該只是罰款:

char *arg[] = {"sh", "-c", "ls | wc", NULL}; 

"僅僅是爲shell將輸入「group」的哪一部分區分爲參數,但在撥打execvp時不需要它們。你的可能的效果就好像你在你的shell中輸入了"ls | wc",包括雙引號(試試吧,你會得到ls | wc: command not found)。

+0

加上缺少的NULL終止,正如@Mike Pulaski在他的回答中指出的那樣。 – DarkDust 2011-04-21 12:50:18

5

您的參數列表必須以NULL指針終止。

char *arg[] = {"sh", "-c", "ls | wc", NULL}; 
2

在你的例子中,它可能會更容易使用system()。

相關問題