2016-03-02 127 views
1

所以我正在創建一個基本的shell。我fork並調用execvp。如果一個命令(即sleep 5m &)最後有「&」,我的父進程不會等待子進程。否則它。所以在孩子的過程中,我打電話給execvp(args[0],args)。如果參數爲sleep 5m &,如何刪除&,以便子進程只讀取而不是&,因爲我猜測問題來自哪裏。無效的時間間隔&在我創建的基本shell中

if(pid==0){ 
    execvp(args[0],args); 
} 
//if parent process 
if(!(strcmp(args[0],"&")==0)){ 
    wait(0); 
} 

編輯:我是能夠通過使用標誌來解決它,如果用戶輸入包括&,我打開標誌。現在,它的工作原理

+1

只是描述散文的代碼幾乎是永遠不夠清晰(散文,不像代碼,可以替換它以多種方式解釋)。請顯示代碼的[最小完整且可驗證的示例](https://stackoverflow.com/help/mcve),以說明問題。 – kaylum

+0

你寫的代碼是什麼?請至少張貼您面臨問題的代碼片段。這樣,我們可以幫助你更好 –

+0

簡單的搜索是一個非常糟糕的主意。如果'&'被轉義或字符串文字會怎麼樣?您需要正確解析輸入。語句的實際執行在設計解釋器(shell是)方面的工作較少。 – Olaf

回答

0
char *idx = strrchr(cmd, '&'); 
if(idx != NULL) 
    *idx = '\0'; 

找到字符串中的最後&和「0」(字符串的結束)

+0

http://pubs.opengroup.org/onlinepubs/009695399/functions/strrchr.html – pm100

+0

oops - 太多的C++編程tx – pm100

+0

我明白這是做什麼,但我不知道在哪裏寫它。我傳遞args [0],參數到execvp。有沒有辦法從參數本身中刪除'&'。 – StephCurry3093