Возникли проблемы с одновременной переадресацией stdin и stdout.При открытии файла я получаю сообщение об ошибке - PullRequest
0 голосов
/ 24 сентября 2018

Я пишу программу, которая будет действовать очень похоже на стандартную командную строку.В этой части кода я создаю новый процесс и пытаюсь выполнить системный вызов.Я тестирую функциональность перенаправления стандартного ввода и стандартного вывода.Ошибка выдается при перенаправлении стандартного ввода, когда мы хотим перенаправить как внутрь, так и наружу.Программа успешно перенаправляет stdin и stdout при выполнении только одного из них.Он также правильно перенаправляет вывод, когда оба установлены.Когда я устанавливаю оба перенаправления, в процессе все еще используется stdin.

void execute(CMD * command) {
    pid_t pid = fork();
    if (pid == 0) {
        fflush(stdin);fflush(stdin);
        if (command->infile != NULL && command->outfile != NULL) {
            int in = open(command->infile, O_RDONLY); //this is the problem line
            dup2(in, fileno(stdin));
            int out = open(command->outfile, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
            dup2(out, fileno(stdout));
            execvp(command->command, command->arguments);
            close(in); close(out);
        } else if (command->infile != NULL) {
            int in = open(command->infile, O_RDONLY);
            dup2(in, fileno(stdin));
            execvp(command->command, command->arguments);
            close(in);
        } else if (command->outfile != NULL) {
            int out = open(command->outfile, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
            dup2(out, fileno(stdout));
            execvp(command->command, command->arguments);
            close(out);
        } else {
            execvp(command->command, command->arguments);
        }
    } else {
        wait(NULL);
    }
}

Мне любопытно, почему одна и та же команда ведет себя по-разному при изменении stdout.Кроме того, если я заменю 'command-> infile' на литерал пути к файлу, см., Например, ниже, он работает нормально.

void execute(CMD * command) {
    pid_t pid = fork();
    if (pid == 0) {
        fflush(stdin);fflush(stdin);
        if (command->infile != NULL && command->outfile != NULL) {
            int in = open(command->infile, O_RDONLY);
            dup2(in, fileno(stdin));
            int out = open(command->outfile, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
            dup2(out, fileno(stdout));
            execvp(command->command, command->arguments);
            close(in); close(out);
        } else if (command->infile != NULL) {
            int in = open(command->infile, O_RDONLY);
            dup2(in, fileno(stdin));
            execvp(command->command, command->arguments);
            close(in);
        } else if (command->outfile != NULL) {
            int out = open(command->outfile, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
            dup2(out, fileno(stdout));
            execvp(command->command, command->arguments);
            close(out);
        } else {
            execvp(command->command, command->arguments);
        }
    } else {
        wait(NULL);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...