2009-10-21 7 views
12

fdopen(), fileno()을 사용하면 기존 파일 설명자를 사용하여 스트림을 열 수 있습니다. 그러나 스트림을 사용하여 파일을 열면 파일을 닫는 적절한 방법은 fclose()FILE 포인터입니다. 어떻게 스트림을 닫을 수 있지만 열린 파일 설명자를 유지할 수 있습니까?기본 파일 설명자를 닫지 않고 FILE 포인터를 닫습니다.

이 동작은 닫는 경우를 제외하고는 fflush()을 호출 한 다음 fileno()을 호출 한 다음 FILE 포인터를 다시 사용하지 않는 것과 비슷합니다. 추가 우려 사항은 fdopen()이 다시 입력되면 FILE 포인터가 여러 개 있고 이제 그 중 하나만 닫을 수 있다는 것입니다. 당신이 (당신이 fileno()이 있기 때문에 당신이 있다고 가정한다)를 POSIXy 시스템의 경우

답변

18

, 파일 기술자 복제 dup()를 사용할 수 있습니다

int newfd = dup(fileno(stream)); 
fclose(stream); 

을 또는 당신은 fdopen() 중복 된 파일을 손으로 수 설명 :

FILE *stream = fdopen(dup(fd), "r"); 

어느 쪽이든은 FD의 다른 사본은 FILE *으로 종료되지 않습니다. 그러나 위치 포인터 공유이므로 두 가지를 동시에 사용하는 경우주의해야합니다. 또한 원래 fd 에 보관 된 fcntl() 자물쇠는 모두 사본을 닫을 때으로 해제됩니다.

+0

windows 및 다른 플랫폼은 fileno()를 지원합니다! 나는이 dup() 솔루션을 매우 우아하고 분명하지 않다고 믿을 수 없다. –

+0

새로운 fd를 원래의 fd로 다시 dup2()하고 새로운 fd를 닫을 필요가 없다. 그래서 모든 것이 파일 스트림이 닫힌 것을 제외하고는 이전의 방식으로 되돌아갑니다. : D 당신이 fclose()를하기 전에 oldfd = fileno (stream)이 필요하다는 것을 의미합니다. –

+0

Jonathan은 멀티 스레드 응용 프로그램에서 뛰어나다. 'fdopen'에 fd를주기 전에'dup'하는 것이 더 좋으므로 원본에 결코 닿지 않도록 할 수 있습니다. – bdonlan

1

다른 모든 것이 실패하면 dup (2)가 도움이 될 수 있습니다.