Execvp()不接受“ ls”作为参数

时间:2019-03-18 18:30:40

标签: c

 #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',则可以。

1 个答案:

答案 0 :(得分:1)

您在这里有两个主要问题。

首先,当您将数组声明为char *cmd[index];时,随着index的更改,数组的大小绑定到index的当前值。它将大小设置为index current 值,该值为0。创建大小为0的数组将调用undefined behavior。您需要为数组设置一个固定大小,该大小必须足以满足您的需求。

char *cmd[MAX_LIMIT];

另一个问题是您选择的定界符。 fgets函数读取一行文本,其中在输入末尾包含换行符。因此,最后读取的哪个参数的末尾都有一个\n。要解决此问题,请将\n添加到定界符列表中。

char delim[] =" \n";