Дескриптор файла stdout не открывается должным образом, если вы ничего не печатаете? - PullRequest
0 голосов
/ 12 апреля 2020

В следующем коде оба 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");
}
...