Пытаюсь прочитать из файла

Я пытаюсь создать программу, которая запускает команды из пользовательского ввода.
В настоящее время она работает для команд из нескольких слов, но я пытаюсь реализовать перенаправления.
Я начал с получения ввода из файла, и это не так. работает, но я не получаю никаких ошибок (я тестирую с помощью команды "wc -l ‹ text.txt", файл text.txt находится в том же каталоге, что и программа.)
Вот код:
- input - это строка с пользовательским вводом
- перед тем, как перейти к этому методу, я уже проверил, что на нем есть перенаправление

redirect(int proc, char * input){
    char * comm;
    if(proc == 1){ //in
        comm = strsep(&input, "<");
    }
    else{ //out
        comm = strsep(&input, ">");
    }

    int proc2 = check(input);
    if(proc2 == 0){ //only one redirection
        if(proc == 1){ //in
            input = trim(input);
            int fd = open(input, O_RDWR);
            close(0);
            dup2(fd, 0);
            close(fd);

            comm = trim(comm);
            char ** words = parse(comm);

            char str[105];
            strcpy(str, "/bin/");
            strcat(str, words[0]);
            shrink(str);
            if(!execvp(str, words)){    /*exec failed */
                exit(1);
            }
        }
        else{ //out

        }
    }
    else{ //more than one redirection/pipe

    }
}

изменить
Мне нужно использовать команду execvp для запуска пользовательского ввода.
Пользовательская команда "‹" должна изменить стандартный ввод, чтобы он был файлом после него.
Я изменил stdin должен быть text.txt, но я не знаю, как передать его в качестве аргумента, чтобы execvp мог его запустить.


person Mark    schedule 10.12.2014    source источник


Ответы (3)


какие типы команд вы пытаетесь выполнить? если ваши команды являются командами DOS, вы можете прочитать пользовательский ввод в строковой переменной, и когда вы хотите выполнить файл. создайте bat-файл, затем выполните его с помощью следующего кода

Process.Start("ваш путь к файлу");

person Mohammad Ahmad Abdullah    schedule 10.12.2014
comment
Это проект, которым я занимаюсь. Я не могу использовать bat-файл. Мне нужно изменить стандартный ввод, чтобы он был файлом. - person Mark; 10.12.2014

Если речь идет только о выполнении команд, указанных пользователем, то для выполнения команд оболочки вы можете использовать вызов system(). Эта функция принимает команду для выполнения в качестве аргумента и выполняет ее в командной оболочке. Вам не нужно будет создавать отдельный файл.

вы можете взять команду, которую пользователь хочет выполнить, как строку, а затем передать ее system() в качестве аргумента для ее выполнения. то есть

 system("wc -l < text.txt");

System() прекрасно работает как в Linux, так и в Windows.

Ссылки: Выполнение команды Linux в программе c

http://www.gnu.org/software/libc/manual/html_node/Running-a-Command.html

person OshoParth    schedule 10.12.2014
comment
Этот ответ хорош для моего вопроса, но я не имел в виду это так. Я отредактирую свой вопрос. - person Mark; 10.12.2014

После долгих тестов и исследований я обнаружил, что файл, который я использовал, не имеет разрешений, необходимых execvp для его чтения.
Я понял это, когда написал код для записи в файл, а затем попробуйте прочитать этот только что созданный файл, и он сработает (после добавления флагов).
Вот код:

redirect(int proc, char * input){
    char * comm;
    if(proc == 1){ //in
        comm = strsep(&input, "<");
    }
    else{ //out
        comm = strsep(&input, ">");
    }

    int proc2 = check(input);
    if(proc2 == 0){ //only one redirection
        if(proc == 1){ //in
            input = trim(input);
            int fd = open(input, O_RDWR);
            close(0);
            dup2(fd, 0);
            close(fd);

            comm = trim(comm);
            char ** words = parse(comm);

            if(!execvp(words[0], words)){   /*exec failed */
                exit(1);
            }
        }
        else{ //out
            input = trim(input);
            int fd = open(input, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
            dup2(fd, 1);
            close(fd);

            comm = trim(comm);
            char ** words = parse(comm);

            if(!execvp(words[0], words)){   /*exec failed */
                exit(1);
            }
        }
    }
    else{ //more than one redirection/pipe

    }
}

Итак, я запускаю команду «ls > text.txt», и она создает файл text.txt с результатами «ls», а затем запускаю команду «wc -l ‹ text.txt», и она возвращает строки в файле. .

person Mark    schedule 10.12.2014