Execvp () не принимает 'ls' в качестве аргумента - PullRequest
0 голосов
/ 18 марта 2019
 #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 Ответ

1 голос
/ 18 марта 2019

У вас есть две основные проблемы:

Во-первых, когда вы объявляете свой массив как char *cmd[index];, размер массива составляет , а не , привязанный к текущему значению index как index изменений.Он устанавливает размер на текущее значение index, равное 0. Создание массива размера 0 вызывает неопределенное поведение .Вам нужно установить фиксированный размер для массива, который будет достаточно большим для ваших нужд.

char *cmd[MAX_LIMIT];

Другая проблема заключается в выборе разделителей.Функция fgets читает строку текста , включая символ новой строки в конце ввода .Таким образом, любой параметр, который будет считан последним, будет иметь \n в конце.Чтобы это исправить, добавьте \n в список разделителей.

char delim[] =" \n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...