簡體   English   中英

Execvp()不接受“ ls”作為參數

[英]Execvp() is not accepting 'ls' as Argument

 #include <string.h>
 #include <stdio.h>
 #include <unistd.h>
 #define MAX_LIMIT 20 
 int main () {


printf("Shell> ");

    char str1[MAX_LIMIT]; 
    fgets(str1, MAX_LIMIT, stdin);    
    char delim[] =" ";
    char *parsed;
    int index = 0;
    char *cmd[index];

    parsed = strtok(str1,delim);    
    while( parsed != NULL) {
        cmd[index] = parsed;
        index++;        
        parsed = strtok(NULL, delim); 
     }   
    cmd[index] = NULL;
    int wow = fork();
    if(wow == 0){   
      execvp((char*)cmd[0],cmd);            
        }
    return(0);
    }

除了execvp()cmd [0]接收字符串'ls'以外,上面的一切工作正常,從技術上講execvp()應該顯示列表,但不能顯示列表。 如果我將cmd [0]替換為'ls',則可以使用。

這里有兩個主要問題。

首先,當您將數組聲明為char *cmd[index]; ,隨着index變化,數組的大小依賴於index當前值。 它將大小設置為index當前值為0。創建大小為0的數組會調用未定義的行為 您需要為陣列設置一個固定大小,該大小應足以滿足您的需求。

char *cmd[MAX_LIMIT];

另一個問題是您選擇的定界符。 fgets函數讀取輸入結尾處包括換行符的文本 因此,最后讀取的哪個參數的末尾都有一個\\n 要解決此問題,請在定界符列表中添加\\n

char delim[] =" \n";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM