다음은 코드 단편입니다.dup2가 순차적으로 발생하지 않는 이유는 무엇입니까?
int saved_stdout = dup(1);
int fd = open("file.txt", O_WRONLY | O_CREAT, 0640);
close(1);
dup(fd);
close(fd);
printf("This text should go into the file\n");
//restore stdout
dup2(saved_stdout, 1);
printf("stdout restore");
나는 dup 및 dup2에 대해 배우려고합니다. 그래서 처음에 내 file.txt를 stdout에 연결했습니다. 그래서 printf를 사용할 때마다 나는 stdout 대신에 file.txt를 써야합니다. 하지만 일단이 사용법을 다 끝내면 다시 복원하기를 원하므로 dup2도 사용합니다.
"이 텍스트는 파일에 저장해야합니다 \ n"라는 텍스트는 실제로 파일에 저장되지 않지만 stdout에는 인쇄됩니다. 왜 그렇게? 나는 그것을 위해 straced, 그 dup2 호출 전에 발견 printf ("이 텍스트 ..."); 성명서, 왜 그렇게?
이것은 내가 찾고 있었던 것이다. 감사합니다. – posixKing
'fflush()'가 "작동"하는 동안, 나는 그것이 잘못된 이유라고 생각합니다. 'open()'이 작동 한 직후에'printf()'를 두는 것만으로도 좀 더 미묘한 일이 일어납니다. 문제는 파일 디스크립터와 FILE 구조가 섞인 것입니다.이 구조는 다른 시스템에서 다른 결과를 얻는 것을 의미하는 정의되지 않은 영역입니다. 원하는 것을하기위한 올바른 방법은'freopen ("file.txt", "w", stdout)'이다. 그 작업은 명확하게 정의됩니다. – gilez
@gilez 필자가 무언가를 작성하고 파일 설명자를 변경하는 동안은 안전해야한다고 생각합니다. 필자는이 대답으로 조금 주저하고 있지만,'printf()'가 발생할 때가 아니라'stdin'이 열릴 때 버퍼링이 초기화되는 것으로 의심하기 때문에 인정합니다. 그러나 그것은 게으 르고 첫 번째 글에서 그것을 할 수 있습니다. – Barmar