Я пишу программу, которая будет действовать очень похоже на стандартную командную строку.В этой части кода я создаю новый процесс и пытаюсь выполнить системный вызов.Я тестирую функциональность перенаправления стандартного ввода и стандартного вывода.Ошибка выдается при перенаправлении стандартного ввода, когда мы хотим перенаправить как внутрь, так и наружу.Программа успешно перенаправляет 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);
}
}