2011-04-15 59 views
0

我想從我的C程序運行一個csh命令。我這樣做是使用下面的代碼:從內部運行csh c

char *csh_command[3]; 
... 
csh_command[2]=(char*)malloc((length_command+strlen("\"\""))*sizeof(char)); 

csh_command[0]=(char*)malloc((strlen("-f")+1)*sizeof(char)); 
csh_command[1]=(char*)malloc((strlen("-c")+1)*sizeof(char)); 

strcat (csh_command[0],"-f"); 
strcat (csh_command[1],"-c"); 
strcat (csh_command[2],"\""); 
strcat (csh_command[2],full_command); 
strcat (csh_command[2],"\""); 
pid=fork(); 
if (pid == 0){ 
     execvp("csh", csh_command); 
} 

什麼,我在這裏做的是創建一個包含參數數組的csh: -f,-c「[運行命令]」

但結果不是預期的結果。子進程只是在後臺運行,不做任何事情。

我們試着運行ls | wc -l使用它。

問題在哪裏?

編輯:

length_command變量已經爲\0 +1。問題是數組未在NULL中終止。並且"是不必要的。

+0

請不要寫關於不投射「malloc」的結果。我意識到這一點,仍然選擇這樣做。 – SIMEL 2011-04-15 18:28:05

+1

我想傳遞給execvp的參數數組必須以'NULL'指針結束? – 2011-04-15 18:30:37

+1

'csh_command'是否包含您期望擁有的字符串? 'sizeof(char)'是1,所以不需要在'malloc'中乘它? – Mahesh 2011-04-15 18:31:11

回答

3

首先錯誤我看到認爲

指針的陣列必須被 由NULL指針終止。

嘗試:

char *csh_command[4]; 
csh_command[3] = 0; 

,什麼是length_command價值?它應該是至少strlen(full_command)+1

UPDATE:

另一個問題可能的,因爲使用的是未初始化字符串,它們可以包含一些垃圾可能與strcat。至少做到以下幾點:

char *str = (char *)malloc(strlen("blabla")+1); 
str[0] = '\0'; 
strcat(str, "blabla"); 

或者只是使用strdup,而不是malloc + strcat

1

第一個問題是你在你的malloc有差一錯誤 - 沒有餘地終止空('\ 0' )

length_command + strlen("\"\"") + 1 

第二個問題是與execvp

指針數組必須以NULL指針終止。

此外,execvp()使用shell並搜索給定命令的路徑。您目前有"csh"的第一個參數是要運行的可執行文件。你說要運行wc;那將是第一個參數。

2

,使你的代碼更加複雜和不正確的比它是幾個問題:

  • malloc() + strcat() = strdup()

  • 除非你正在計劃有一個通用的cshcmd()函數或什麼的,你爲什麼要複製字符串文字而不是直接使用它們?

  • execvp()參數數組必須以NULL結尾。

  • 在這種情況下,數組初始值設定項和匿名數組是一種幸運 - 你可能不會錯過最後的NULL值。當然,除非你必須使用完全動態的結構......

  • 你不應該在命令參數中有那些額外的雙引號。這些用於在使用命令行時運行的shell,並在調用exec()時被剝離。換句話說,csh應該看到ls -1 | wc -l,而不是"ls -1 | wc -l"

  • 哦,並且exec()中的參數數組的第一個元素始終爲argv[0]。這可能應該是沿線csh,而不是一個選項。

編輯:

  • 一兩件事:你清除使用strcat()之前malloc()分配的內存? strcat()會高興地溢出你的緩衝區,這取決於它已經有的任何隨機內容...