Я не вижу никаких проблем.Я попробовал твой код самостоятельно.И это работает!Мой упрощенный код выглядит следующим образом:
int main(void) {
int fd;
char* const param[] = {"/bin/ls", NULL};
fd = open("outfile", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
if (fd < 0) {
perror("open failed\n");
exit(0);
}
pid_t pid = fork();
if (pid < 0) {
perror("fork failed\n");
exit(0);
}
else if (pid == 0) {
dup2(fd, STDOUT_FILENO);
close(fd);
execvp("ls", param);
}
else {
wait(NULL);
}
}
Я скомпилирую его выполнение и найду ожидаемые результаты в outfile.
Единственная разница в том, что я открываю подачу с помощью S_IRUSER |Параметры разрешения S_IWUSER, так как в противном случае открытие завершится неудачно.Я вижу подобные вещи в вашем коде, но как-то вы их прокомментировали ...