В следующем коде оба printfs go к терминалу, несмотря на перенаправление ввода-вывода с использованием dup2:
int main() {
int out_fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, DEF_MODE);
int saved_stdout = dup(STDOUT_FILENO);
dup2(out_fd, STDOUT_FILENO);
close(out_fd);
printf("Should be in test.txt\n");
dup2(saved_stdout, STDOUT_FILENO);
close(saved_stdout);
printf("Back in the terminal\n");
}
Однако, когда я вставляю дополнительную печать перед первым dup2, «Должно быть в тесте .txt "успешно отображается в test.txt:
int main() {
puts("Weird");
int out_fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, DEF_MODE);
int saved_stdout = dup(STDOUT_FILENO);
dup2(out_fd, STDOUT_FILENO);
close(out_fd);
printf("Should be in test.txt\n");
dup2(saved_stdout, STDOUT_FILENO);
close(saved_stdout);
printf("Back in the terminal\n");
}
Существует ли причина, по которой перенаправление ввода-вывода не удалось, если я заранее ничего не печатал на стандартный вывод?
РЕДАКТИРОВАТЬ: Решено! Очистка первого printf сразу после печати гарантирует его печать в test.txt.
int main() {
int out_fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, DEF_MODE);
int saved_stdout = dup(STDOUT_FILENO);
dup2(out_fd, STDOUT_FILENO);
close(out_fd);
printf("Should be in test.txt\n");
fflush(stdout);
dup2(saved_stdout, STDOUT_FILENO);
close(saved_stdout);
printf("Back in the terminal\n");
}