2012-02-14 69 views
0

我目前正試圖讓我的C程序讀取來自用戶的Unix參數。我到目前爲止搜索了這個網站,但我一直無法弄清楚我做錯了什麼 - 雖然我承認我的指針實現技能是相當有限的。C - 使用execvp和用戶輸入

以下是我現在的代碼;我一直在與沒有運氣的指針搞混了。錯誤也是說我需要使用const * char,但是我在其他例子中看到* char可以由用戶輸入。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 

main() 
{ 
    char args[128]; 
    //User input 
    printf("> "); 
    fgets(args, 128, stdin); 
    execvp(args[0], *args[0]); 
} 

我得到的錯誤如下:

smallshellfile.c: In function ‘main’: 
smallshellfile.c:13:21: error: invalid type argument of unary ‘*’ (have ‘int’) 
smallshellfile.c:13:5: warning: passing argument 1 of ‘execvp’ makes pointer from integer without a cast [enabled by default] 
/usr/include/unistd.h:575:12: note: expected ‘const char *’ but argument is of type ‘char’ 

有誰知道這個問題可能是什麼?

回答

2

你有幾個問題:

  1. *args[0]是沒有意義的。 args是數組。 args[0]是char。什麼是*args[0]

  2. 您必須創建一個以NULL結尾的char*數組,作爲第二個參數傳遞。

  3. args[0]args中的第一個字符。你應該傳遞整個字符串(只是args),不僅僅是它的第一個字符。

試着這麼做:

char *argv[]={args,NULL}; 
execvp(args,argv); 
+0

不要忘記,命令名在'argv [0]'中出現,在'argv [1]'中出現第一個參數,在'argv [2]'中出現空指針。 – 2012-02-14 00:19:14

+0

@JonathanLeffler如果我正確地閱讀了這個問題,他不想傳遞任何參數(程序名除外),所以NULL應該在'argv [1]'中。 – asaelr 2012-02-14 00:24:09

+0

[0]只是因爲我用完了想法。我擺脫了他們,並做出了修改 - 我編譯時的錯誤消失了,但執行程序在被調用時不會執行任何操作 - 即如果我嘗試ls,它只會終止程序。 – limasxgoesto0 2012-02-14 00:25:13

0

這可能會更好地爲您:

#include <stdio.h> 
#include <unistd.h> 

int main(void) 
{ 
    char args[128]; 
    char *argv[] = { "sh", "-c", args, 0 }; 
    printf("> "); 
    if (fgets(args, 128, stdin) != 0) 
    { 
     execvp(argv[0], argv); 
     fprintf(stderr, "Failed to exec shell on %s", args); 
     return 1; 
    } 
    return 0; 
} 

它具有最低限度的必要頭;它有一個正確的聲明main() - C99需要一個顯式的返回類型;它會在用戶輸入的信息上運行shell。除非用戶在點擊返回之前輸入了超過126個字符,否則錯誤消息會以換行符正確結束。如果execvp()或任何exec*()函數返回,則失敗;你不需要測試它的狀態。

我正在通過讓殼做真正的工作而驚人地作弊。但是你最終可能想要將用戶輸入的內容分解成單詞,這樣命令就是第一個,並且有多個參數。然後,您會分配一個更大的argv數組,然後解析該字符串,將每個單獨的參數放入其自己的條目argv中,然後使用execvp()開始有意義。請注意,如果要完成I/O重定向,那麼它就是你的shell必須要做的(除非你運行真正的shell來爲你做 - 就像我一樣)。