2014-02-16 34 views
0

我正在Ubuntu上編寫此程序。 如果鍵入這個命令到外殼如何添加空格字符來觸發var args C++ execlp()

組的根SYS倉

它輸出

root : root 
sys : sys 
bin : bin 

但是我正在寫一個C++程序,與使用

execlp調用組
execlp("groups", "groups", args.c_str(), NULL); 

其中args =「root sys bin」。我只是得到一個:自組顯然只是看着那整個字符串將以argv沒有這樣的用戶錯誤[0],這是運行

groups "root sys bin" 

如何做我創建了execlp正確的變量參數等效在每個用戶上一次一個地運行組?

+0

嘗試'execlp( 「組」, 「組」, 「根」, 「SYS」, 「賓」, 「空」);' – bobah

+0

我認爲最後一個參數應該是'NULL'(空指針)。 – sleepy42

回答

1

一個選項是要求/bin/sh以正常方式處理輸入。當然除了處理空格之外,這也會處理像$,#,~,*等字符,這可能是也可能不是你想要的。

root ;rm * 

否則,execl型功能將無法正常工作,除非你知道電話號碼:

execl("/bin/sh", "sh", "-c", ("groups " + args).c_str(), nullptr); 

很顯然,如果數據是用戶輸入的,並且可能含有討厭的字符串像不要用這種方式在編譯時的命令行參數。假設你的args字符串可能有不同數量的參數,你需要改用execv類型的函數。

std::string args = "root sys bin"; 

std::vector<std::string> arg_vec; 
std::istringstream arg_iss(args); 
std::copy(std::istream_iterator<std::string>(arg_iss), 
      std::istream_iterator<std::string>(), 
      std::back_inserter(arg_vec)); 

char groups_exec[] = "groups"; 
std::vector<char*> arg_ptr_vec{ groups_exec }; 
std::for_each(arg_vec.begin(), arg_vec.end(), 
       [&](std::string& arg){ arg_ptr_vec.push_back(&arg[0]); }); 
arg_ptr_vec.push_back(nullptr); 
execvp("groups", arg_ptr_vec.data()); 
+0

這個程序實際上沒有用戶輸入。但是,第一個snipet代碼對我來說是一個完美的解決方案。謝謝! – MatUtter

+0

實際上我使用execvp解決方案結束了。還是謝謝! – MatUtter

0

的args參數以execlp被定義爲 「char * const的ARGV []」,所以我覺得你可以做類似

爲const char * myArgs [3] = { 「根 」SYS「,」 BIN「};

,然後用myArgs替換args.c_str()

我應該承認有對Ubuntu編寫軟件的零經驗 - 這是我想嘗試下一個被我試圖讓execlp到工作。

編輯:這是錯誤的 - 我有混了起來,是l在execv(),bobah和sleepy42似乎已經得到它。