2012-09-20 28 views
2

我已經寫了孩子的命令執行代碼爲Win32:使用的CreateProcess調用exec *函數用一個命令參數儘可能與CreateProcess的

CreateProcessW(NULL, // app 
       &commandW[0], // command line 
       NULL, // process security attributes 
       NULL, // primary thread security attributes 
       TRUE, // handles are inherited 
       0, // creation flags 
       NULL, // use parent's environment 
       NULL, // use parent's current directory 
       &startup_info, // STARTUPINFOW pointer 
       &process_info); // receives PROCESS_INFORMATION 

它使用一個「絕招」,並在第二個參數把整個命令,通常只包含傳遞給程序的參數。我想爲POSIX做同樣的事情,但同樣的「詭計」不適用於execlp函數(我也打賭其他所有函數)。有什麼方法可以繼續使用單一的std::string command並啓動一個流程?將命令分割爲可執行文件名和參數是可能的,但如果可能的話,我會盡量避免大量工作。

回答

1

您可以調用一個shell,並將大字符串傳遞給shell,並讓shell處理它。自己嘗試一下:

sh -c "echo 'hello world'" 

(即傳遞兩個參數,「-c」和包含命令和參數的大串)

更妙的是:使第一個命令exec,這將使你的新工藝「替換「它產生的shell,那麼沒有人會甚至知道它是使用shell啓動的。

正如@ecatmur的評論中指出的那樣,這是system調用的確切功能。

但是,你正在打開自己的潛在(嚴重)問題:你現在必須處理字符的引用和轉義。 shell可以(並且將)解釋任何特殊字符,除非它們被轉義,並且任何有空格的參數都必須正確引用。

有類似Unix的操作系統處理參數的原因是他們所做的。

我認爲Windows方法有根本性的缺陷。這是一個嚴重的設計監督,可以防止將複雜的字符串作爲命令行參數傳遞給其他程序。

+0

我知道我的「設計缺陷」。所有這些都是執行生成的編譯器調用字符串。 Quotes等已經在生成的'string'中正確設置。 – rubenvb

+0

真正的設計缺陷(恕我直言)在Windows'CreateProcess'調用。但是如果你確定你的字符串是安全的,產生一個shell應該可以工作(並且會使其工作非常類似於Windows) –

+2

請注意,這正是['system'](http://pubs.opengroup.org/ onlinepubs/9699919799/functions/system.html)。 – ecatmur