2017-12-08 19 views
0

여기에 내 코드가 있는데 제대로 작동하지 않습니다.stdout을 파일로 리디렉션 한 다음 stdout을 다시 복원하는 방법은 무엇입니까?

int pfd = open("file", O_WRONLY, 0777); 
int saved = dup(1); 
close(1); 
dup(pfd); 
close(pfd); 
printf("This goes into file\n"); 

// restore it back 
dup2(saved, 1); 
close(saved); 
printf("this goes to stdout"); 

내 코드를 일부 수정했습니다.

+0

'dup (pfd);'는 파일에 stdout 쓰기를하지 않습니다. – tkausl

+0

'dup2 '를 여러 번 사용 해본 적이 있습니까? –

+0

죄송합니다. dup (pfd) 앞에'close (1)'을 추가하는 것을 잊었습니다. – posixKing

답변

0

함수 호출의 반환 값을 확인해야합니다. 대부분의 기능에 대해 오류 조건을 확인해야합니다. 이렇게하면 처음에 존재하지 않는 경우에 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()특정 파일 기술자 번호에 파일 기술자를 복사로에 대한 깨끗하고 안전하다. 당신은 당신이 복원 할 때 그것을하지만, 당신은 또한 초기 리디렉션을 위해 그것을해야합니다.

+0

내 잘못이야, 내 실수 였어. 댓글을 철회합니다. 귀하의 답변에 감사드립니다. fflush가 트릭을 수행합니다. – posixKing