함수 호출의 반환 값을 확인해야합니다. 대부분의 기능에 대해 오류 조건을 확인해야합니다. 이렇게하면 처음에 존재하지 않는 경우에 open()
이 요청 된 파일을 생성하도록하려면 O_CREAT
플래그를 추가해야하는 문제가 발견되었을 수 있습니다.
하지만 여기서 가장 중요한 문제는 아닙니다. 버퍼링 문제를 다루고 있습니다. 첫 번째 printf()
의 출력은 메모리에 버퍼되므로 파일 설명자 1이 printf()
이 호출 될 때 파일을 참조하더라도 사용자가 작성하는 데이터가 대상 파일로 즉시 플러시되지는 않습니다. 그런 다음 원래 stdout
파일 핸들을 복원하므로 데이터가 실제로 플러시 될 때 (복원 된) 원본 stdout으로 이동합니다. stdout
다시 전환하기 전에 fflush()
ING에 의해이 문제를 해결 :
int pfd = open("file", O_WRONLY | O_CREAT, 0777);
int saved = dup(1);
close(1);
dup(pfd);
close(pfd);
printf("This goes into file\n");
fflush(stdout); // <-- THIS
// restore it back
dup2(saved, 1);
close(saved);
printf("this goes to stdout");
참고 또한 dup2()
가 특정 파일 기술자 번호에 파일 기술자를 복사로에 대한 깨끗하고 안전하다. 당신은 당신이 복원 할 때 그것을하지만, 당신은 또한 초기 리디렉션을 위해 그것을해야합니다.
'dup (pfd);'는 파일에 stdout 쓰기를하지 않습니다. – tkausl
'dup2 '를 여러 번 사용 해본 적이 있습니까? –
죄송합니다. dup (pfd) 앞에'close (1)'을 추가하는 것을 잊었습니다. – posixKing