#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',则可以。
答案 0 :(得分:1)
您在这里有两个主要问题。
首先,当您将数组声明为char *cmd[index];
时,随着index
的更改,数组的大小不绑定到index
的当前值。它将大小设置为index
的 current 值,该值为0。创建大小为0的数组将调用undefined behavior。您需要为数组设置一个固定大小,该大小必须足以满足您的需求。
char *cmd[MAX_LIMIT];
另一个问题是您选择的定界符。 fgets
函数读取一行文本,其中在输入末尾包含换行符。因此,最后读取的哪个参数的末尾都有一个\n
。要解决此问题,请将\n
添加到定界符列表中。
char delim[] =" \n";