파일 설명자는 나중에 어떻게 재활용되고 재사용됩니까?

파일 설명자는 나중에 어떻게 재활용되고 재사용됩니까?

C 및 C++의 맥락에서 close()시스템 호출은 open()커널이 fd를 재활용하고 나중에 동일한 프로세스 수명주기에서 호출할 때 이를 재사용하는 유일한 방법입니까? 다중 스레드 프로그램은 어떻습니까?

답변1

주의 깊게 읽어보세요닫기(2)그리고고급 Linux 프로그래밍

귀하의 진술이 잘못되었습니다. 닫기는 다음과 같습니다.시스템 호출(에 나열됨시스템 호출(2)Linux의 경우) 애플리케이션은 커널에 리소스를 해제하라고 지시합니다(그 반대는 아님). 당신이 사용할 수있는트랙(1)특정 명령이나 프로세스에 의해 수행되는 시스템 호출에 대해 알아봅니다. 당신은 또한 볼 수 있습니다병렬 스레드(7),바우처(7),포크(2),실행(2),클론(2)

예,파일 설명자(그리고주소 공간존재하다가상 메모리, 바라보다매핑(2))는 주어진 모든 스레드에 공통입니다.프로세스. 그러나 낮은 수준을 사용하여 직접 "스레드"를 생성하는 경우는 (드물게) 있습니다.클론(2)시스템 호출(실제로는구현자이와 같은 스레드 라이브러리병렬 스레드), 혹시라도 당신이아니요사용되는 것들이 CLONE_FILES 다릅니다. 하지만 직접 전화하는 clone것은 어둠의 예술입니다.

pid가 1234인 특정 프로세스에 대해 Linux에서는 파일 설명자 세트를 쿼리할 수 있습니다(공정(5)) via /proc/1234/fd/ 및 via 매핑된 메모리 /proc/1234/maps(blah blah blah... 유용한 것들이 많이 있습니다.가짜) 의 파일 및 링크 /proc/1234. 프로세스 내부에서 /proc/self/fd/매개변수로 사용할 수 있습니다.디렉토리 열기(3)

물론 파일 디스크립터는 단순한 파일 디스크립터가 아닙니다.POSIX아니면 Linux보다 더 표준적인 것C99또는C++11하나. 예를 들어,파일 번호(3)&열려 있는C99가 아닌 POSIX에 정의되어 있습니다.

따라서 특정 숫자(가령 49)가 open여러 번 반환되는 경우 이는 프로그램의 다른 부분(아마도 일부 라이브러리, 다른 스레드)이 close 49를 호출하기 때문입니다. 커널은 묻지 않고 파일 설명자를 "마법처럼" 닫지 않습니다(프로세스가 종료되는 경우 제외). 디버거를 사용 strace하거나 gdb 디버거에 중단점(조건부 중단점)을 설정할 수 있습니다.close

답변2

이 외에도 close파일 설명자를 닫고 재사용할 수 있는 몇 가지 시스템 호출이 있습니다. dup2Linux에서는 dup3.

이에 대한 추적 로그를 확인할 수도 있습니다.

관련 정보