Адрес вне границ в C, проблемы с созданием команды ls - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь создать какую-то оболочку C на C, но у меня проблемы с выполнением команды ls.mkdir и cd работают нормально, но с ls это дает мне

"Ошибка сегментации адреса вне границ"

Надеюсь, кто-нибудь может мне помочь.Вот мой код.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <readline/readline.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    printf("\033[1;33mWelcome To Crisp Bacon Shell\n");
    while (1) {
        printf("\033[0m%s $", hostname);
        input = readline("");
        command = get_input(input);

        child_pid = fork();
         if (child_pid < 0) {
            perror("Fork failed");
            exit(1);
        }else if (child_pid == 0) {
            /* Never returns if the call is successful */
            execvp(command[0], command);
            printf("This won't be printed if execvp is successul\n");
        } else {
            waitpid(child_pid, &stat_loc, WUNTRACED);
        }

        free(input);
        free(command);
    }
    return 0;
}

char **get_input(char *input) {
    char **command = malloc(8 * sizeof(char *));
    char *separator = " ";
    char *parsed;
    int index = 0;

    parsed = strtok(input, separator);
    while (parsed != NULL) {
        command[index] = parsed;
        index++;

        parsed = strtok(NULL, separator);
    }

    command[index] = NULL;
    return command;
}

Единственное, что я понимаю, это как-то связано с памятью и ссылками или указателями, но я попытался изменить все с & ссылки на указатели, и это просто дало мне больше ошибок, что мне делать

1 Ответ

0 голосов
/ 16 мая 2019

В ваших фрагментах кода было много необъявленных переменных. Вам также нужно получить имя хоста, это не глобальная переменная. Также рекомендуется объявить свои функции перед их использованием.

Это прекрасно работает:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <readline/readline.h>
#include <unistd.h>
#include <sys/wait.h>

char **get_input(char *input) {
    char **command = malloc(8 * sizeof(char *));
    char *separator = " ";
    int index = 0;

    char *parsed = strtok(input, separator);
    while (parsed != NULL && index < 8) { // you need to make sure the index does not overflow the array
        command[index] = parsed;
        index++;

        parsed = strtok(NULL, separator);
    }

    command[index] = NULL;
    return command;
}

int main() {
    printf("\033[1;33mWelcome To Crisp Bacon Shell\n");
    while (1) {
        // hostname does not exist, you need to fetch it
        char hostname[1024];
        gethostname(hostname, 1023); // POSIX only
        printf("\033[0m%s $", hostname);
        char *input = readline(NULL);
        char **command = get_input(input);

        pid_t child_pid = fork();
        if (child_pid < 0) {
            perror("Fork failed");
            exit(1);
        } else if (child_pid == 0) {
            /* Never returns if the call is successful */
            execvp(command[0], command);
            printf("This won't be printed if execvp is successul\n");
        } else {
            waitpid(child_pid, NULL, WUNTRACED); // since you don't use the middle argument, no need to point to valid data
        }

        free(input);
        free(command);
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...