Вы можете открыть файл и затем dup2()
дескриптор файла для стандартного ввода, или вы можете закрыть стандартный ввод и затем открыть файл (который работает, потому что стандартный ввод - дескриптор 0, а open()
возвращает наименьший доступный дескриптор).
const char *input = "input.txt";
int fd = open(input, O_RDONLY);
if (fd < 0)
throw "could not open file";
if (dup2(fd, 0) != 0) // Testing that the file descriptor is 0
throw "could not dup2";
close(fd); // You don't want two copies of the file descriptor
execvp(command[0], &command[0]);
fprintf(stderr, "failed to execvp %s\n", command[0]);
exit(1);
Возможно, вы захотите более умную обработку ошибок, чем throw
, не в последнюю очередь потому, что это дочерний процесс, и это должен знать родитель.Но throw
сайты отмечают точки, где обрабатываются ошибки.
Обратите внимание на close()
.