2016-03-13 26 views
-2

我試圖使用命令行發送參數C文件發送,之後把它作爲一個execvp函數Ç如何使用CMD參數傳遞,並用它在execvp

int main (int argc, char **argv){ 
    pid_t p; 

    char * vec [] = {*argv, (char*)NULL}; 

    for(i = 0; i < argc ; i++){ 
     p = fork(); 

     if(p > 0){ 
      //Fork validations 
     }else{ 
      execvp(vec[0], vec); 
      exit(1); 
     } 
    } 
}  

的參數並在殼我試圖使用./executable 3 ls ps誰

之後,程序凍結,不顯示命令!

任何幫助?

+0

您目前的解決方案會發生什麼? – DanielGibbs

+0

程序凍結並且不顯示命令 – Mark

+1

您嘗試啓動gdb嗎? – Chirality

回答

1

你的問題很簡單。而不是從你的論點執行命令,你的定義

char *vec[] = {*argv, (char*)NULL}; 

或更容易理解,

char *vec[] = {argv[0], (char*)NULL}; 

和事實的,你從來沒有改變這個vec,意味着你重新執行命令的名字是在argv[0] ...並且它的名稱是您的可執行文件因此您的代碼始終在執行自己並始終分叉,從而創建一個叉炸彈


你想做的是從參數中執行命令。我不知道該3確實在爭論什麼,但我想你想從那裏命令執行休息:

char *vec[] = {0, 0}; 
// only process arguments starting from 2 (a.k.a ls in your example) 
for(i = 2; i < argc ; i++){ 
    vec[0] = argv[i]; 
    if (!fork()) { 
     execvp(vec[0], vec); 
     exit(1); 
    } 
} 

當然是沒有必要使用execvpvec如果你沒有傳遞變量參數數量; execlp將工作得很好:

for (i = 2; i < argc; i++) { 
    if (!fork()) { 
     execlp(argv[i], argv[i], (char*)0); 
     exit(1); 
    } 
} 
0

你只是運氣好,我現在有一個同樣的問題應得的分配。

1)爲什麼要使用

字符* VEC [] = {的argv,(炭)NULL};

直接使用argv就是整點,它會使你的代碼更加清晰。

我建議製作一個通用函數,它將在選項和參數中分隔輸入,並使用回調使其更加靈活,但這取決於您。 像這樣

typedef int (*pCallback) (char *, char*, void *); 
int parseCmdLine(int argc, char *argv[], pCallback p, void 
*userData); 
int parseCallback(char *key, char *value, void *userData); 

你能發佈原型,以你的功能,使其更清晰,你想要做什麼。

另外你也忘記了我的聲明。我會推薦使用像argv_counter更清晰的東西:

int argv_counter;

這是不是很清楚你想要發佈一個更完整的代碼。以下是我所看到的內容以及我在 中看不到點的原因爲什麼不通過argv或argv [0],在通過這兩點時都沒有意義。

execvp(argv [0],argv);

int main (int argc, char **argv){ 
    pid_t p; 
    int argv_counter; 
    char * vec [] = {*argv, (char*)NULL}; 

    for(argv_counter = 0; argv_counter < argc ; argv_counter++){ 
     p = fork(); 

     if(p > 0){ 
      //Fork validations 
     } 
     else{ 
      execvp(argv[0], argv); 
      exit(1); 
     } 
    } 
}