2011-09-29 77 views
1

因此,這裏是我的代碼,竟然放棄了我的問題位:與execvp()有問題

void childProcessHandler(string command){ 


int argCounter = 0; 
for(int i=0; i!=command.size(); i++) 
    argCounter+=(command.at(i) == ' '); 

char * temp, *token; 
char *childArgs[argCounter]; 

argCounter = 1; 

temp = new char [command.size()+1]; 
strcpy (temp, command.c_str()); 

token = strtok (temp," "); 
childArgs[0] = token; 

while (token!=NULL) 
{ 
    token = strtok(NULL," "); 
    childArgs[argCounter] = token; 
    argCounter++; 
} 

//delete[] temp; //Should remove token as well? 

execvp(childArgs[0], childArgs); 

cout<<"PROBLEM!"<<endl; 
exit(-1); 

} 

在main()方法,我的代碼獲取到一個地步,叉()(父進程然後等待子進程退出),那麼子進程(進程ID == 0是?)將用戶輸入(運行+ args的命令)作爲參數調用方法childProcessHandler。然後我標記用戶輸入並調用execvp。

全部編譯並執行。 execvp之後的行永遠不會到達,因爲只有在出現錯誤時纔會返回yes。

該項目是爲了模擬一個unix終端,但是當我給它的命令「日期」沒有得到打印,它應該...孩子退出和父進程恢復就好,但沒有任何東西被髮回到終端窗戶...

我在做什麼錯?

(另外我們「推薦」使用strtok的記號化,但如果任何人有什麼簡單的我接受的觀點。)

謝謝!

EDIT

上面的代碼的工作原理,例如,如果我輸入「日期」而不是「日期」。我認爲可能會有一些「tokenizer」在childArgs []數組的末尾沒有放置空字符。我會玩,並感謝您的快速反應!

(忍者編輯,也註釋掉刪除[]溫度暫時)你是混合的std :: string和炭/炭*

+0

您正在刪除childArgs所指的數組。 –

+0

評論刪除[]溫度,仍然沒有變化。我的理解是,strtok在完全運行後(或者爲什麼不刪除它)會使原始字符串或多或少無用。 – OmegaTwig

回答

1

你childargs矢量指向到的存儲器「TEMP」的塊分配的字節。當你釋放temp時,你將刪除childargs指針所指向的內存,可能會損壞矢量中的某些值。

刪除調用以刪除[]以停止釋放childargs指針指向的內存。你不會泄漏記憶。一旦你調用exec_ (),你的整個過程映像將被替換。唯一一個在執行exec _()(大部分時間)時仍然存在的文件描述符。

作爲一個測試,嘗試一些更簡單的方法:在調用子對象中的fork()之後,只需調用帶有「date」路徑的exec即可。在擺弄參數列表向量之前做這件事。

作爲另一個測試,請將您的調用移除到exec,並打印出您的整個指針矢量,以確保您的標記化按照您認爲應該的方式工作。請記住,您的最終條目必須爲NULL,以便您知道向量的末尾位置。

+0

最終條目不爲空。謝謝你快速的回覆! – OmegaTwig

2

。很好,但你必須小心,他們有不同的行爲。

特別地,這行:

temp = new char [command.size()+1]; 

是建立一個實際數組來保存在一個字符串

token = strtok (temp," "); 

這是使令牌(這僅僅是一個指針)指向一個地方內溫度。 strtok()修改輸入字符串以在字符串中創建臨時字符串(聽起來很瘋狂,我知道)。

你需要複製該字符串的strtok()讓你進入一個永久的家。要麼使用std :: string來節省時間和代碼,要麼使用char *方法並自己分配新的字符串。例如。而不是:

childArgs[0] = token; 

你需要:

childArgs[0] = new char[strlen(token)+1]; 
    strcpy(childArgs[0], token); 

這同樣適用於循環在命令參數期間存儲陣列中的令牌。指針

+0

感謝您的幫助。不幸的是,這並沒有解決我遇到的問題,但它仍然有幫助。 – OmegaTwig

+0

你確定嗎?完成這些更改後,您的代碼完全適合我。編輯:沒關係,我看到了其他答案,這也是正確的:) – MattJ