код следующим образом:
int main(int argc, char **argv)
{
const char *file = "/tmp/out";
int fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU);
int stdout_tmp = dup(1);
close(1);
dup(fd);
puts("hello world!");
// fflush(stdout);
close(1);
close(fd);
dup(stdout_tmp);
puts("redirect completed!");
exit(0);
}
Я успешно скомпилировал код без каких-либо предупреждений, используя gcc10.2.0. Вопреки моему ожиданию, обе строки выводятся в стандартный вывод, а не в файл hello world в файле /tmp/out, и перенаправление завершено! в стандартный вывод. Когда раскомментируйте fflush(stdout), он работает!
Я предполагаю, что puts() не обновляет буфер в пользовательском пространстве, после восстановления стандартного вывода и выхода буфер автоматически обновляется.
получает () выходную строку с завершающим '\n', и буфер stdout будет автоматически обновляться при встрече с '\n'. Зачем нужно вызывать fflush(stdout) вручную?