Моя программа работает только когда я объявляю дополнительный массив - PullRequest
0 голосов
/ 22 марта 2019

Я создаю простую оболочку для класса. В моей директории оболочки есть две программы, которые называются «alomundo» и «echo». "./alomundo" печатает "Alo mundo!" в консоль, и ./echo выполняет эхо Ubuntu с заданными аргументами. Дело в том, что моя программа работает, только если я объявил char aux [15]. Заметьте, я не пользуюсь ею даром. Кто-нибудь может понять, что не так?

Пример ввода будет

. / Shell echo a b, alomundo, echo abc

Правильный вывод

a b

Alo mundo!

а

Вывод, когда char aux [15] не объявлен, просто:

Alo mundo!

а


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

int main(int argc, char *argv[]) {
    char aux[15]; // <---- GRRRR
    int child; // will hold the childs PID after fork()
    int i = 0; // counter to loop through this mains *argv[]
    int t = 0; // auxiliar counter to loops
    int arg_len; // will hold the length of each argument while the argument is being processed
    int args = 0; // current number of arguments in the argv1 vector
    int send = 0; // boolean to check if the command should be executed in the current loop or not
    char *command; // string to hold the main command name

    char *argv1[15]; // vector to hold the arguments passed to execve

    for(i=1; i<argc; i++) {
        arg_len = strlen(argv[i]);
        argv1[args] = (char *) malloc(sizeof(char) * 25);
        for(t=0; t<25; t++) {
            argv1[args][t] = '\0';
        }

        if (argv[i][arg_len-1] == ',') {
            argv[i][arg_len-1] = '\0';
            send = 1;
        }
        else if (i == (argc-1)) {
            send = 1;
        }

        if (args == 0) {
            command = (char *) malloc(sizeof(char) * 255);
            strcpy(command, "./");
            strcpy(argv1[args], "./");
            strcat(command, argv[i]);
        }
        strcat(argv1[args], argv[i]);
        args++;

        if (send) {
            child = fork();
            if (child == 0) {
                argv1[args+1] = 0;
                execve(command, &argv1[0], envp);
                return 0;
            }
            else {
                waitpid(child);
                free(command);
                for (t=0; t<args; t++) {
                    free(argv1[t]);
                    argv1[t] = NULL;
                }
                args = 0;
                send = 0;
            }
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 22 марта 2019
  1. waitpid(child) кажется неправильным.Попробуйте:
// ...
#include <sys/wait.h>
// ...
    pid_t child;
    int wstatus;
// ...
            else {
                wait(&wstatus);
envp не объявлено.Попробуйте:
// ...
int main(int argc, char *argv[], char *envp[]) {
// ...
Ошибка при обработке argv1.Попробуйте:
// ...
            if (child == 0) {
                argv1[args] = 0;
                execve(command, argv1, envp); // why use &argv1[0] ?
// ...

Я думаю, что виновником является (3).

Компиляция с различными уровнями оптимизации (-O и т. Д.), По-видимому, влияет на то, влияет или нет ошибочный+1 вызывает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...