파일 디스크립터 링크 이식성

파일 디스크립터 링크 이식성

나는 항상 이것이 궁금했지만 그것을 알아내는 데 시간을 투자하지 않았습니다. 그래서 여기 있습니다 - 사용법이 얼마나 이식성이 있는지여기에 표시아니면 /proc/$$/fd/$N아니면 /dev/fd/$N?POSIX 보증 /dev/null, /dev/tty, and /dev/console (저번에 댓글 보기 전까지는 몰랐지만이 답변)하지만 다른 사람들은 어떻습니까?

내가 아는 한 이러한 현상은 매우 일반적이지만 어떤 시스템에서 이를 수행할 수 있습니까?아니요그들을 찾을 것으로 예상됩니까? 왜 안 돼? 다른 것보다 하나를 찾을 가능성이 더 높습니까? 그들은 항상 비슷한 속성을 보이는가?

저는 이러한 장치를 다양한 방식으로 광범위하게 사용하는 경향이 있는데, 사용하는 데 어려움을 겪고 있는 것은 아닐까 궁금합니다.

또한, 위의 질문은 전적으로 저의 문제로 이해되어야 합니다.생각하다알고 싶지만 당연히 먼저 물어봐야 할 부분이기 때문에 제가 이 분야에 대해 가장 지식이 없을 수도 있으므로 답변을 위한 엄격한 요구 사항으로 받아들여서는 안 됩니다. 가능하다면 알려주시기 바랍니다.

답변1

이러한 심볼릭 링크는 Linux에서 거의 보편적이지만 다른 곳에서는 존재하지 않습니다(이를 에뮬레이트하는 Cygwin 제외). AIX 및 Solaris에도 존재하지만 기호 링크는 아닙니다. 열려 있는 파일에 대한 정보를 얻으려면 ./proc/PID/fd/NUM/proc/PID/fd/NUMlsof

그리고/proc/PID/fd

리눅스

Linux에서는 ID가 있는 프로세스 파일을 가리키는 약간 마법 같은 기호 링크입니다./proc/PID/fd/NUMPID파일 설명자가 열려 있습니다.일련번호. 이 링크는 마술적이며 예를 들어 파일이 삭제된 경우에도 파일에 액세스하는 데 사용할 수 있습니다. 이 링크는 이름 바꾸기를 통해 파일도 추적합니다. /proc/self다음을 가리키는 마법의 상징적 링크입니다./proc/PIDPID링크에 접속하는 과정입니다.

이 기능은 거의 모든 Linux 시스템에 존재합니다. 운전기사가 제공하는 것입니다프로세스 파일 시스템, 이는 기술적으로 선택 사항이지만 너무 많은 작업( ps읽어오는 작업 만들기 포함)에 사용되므로 임베디드 시스템에서도 거의 빠지지 않습니다./proc/PID

시빈

Cygwin은 Linux(Cygwin 프로세스용) 및 ./proc/PID/fd/NUM/proc/self

솔라리스(버전 2.6부터),엑스

각 파일 설명자에 대한 항목이 있지만 열려 있는 파일과 동일한 유형으로 나타나므로 파일 경로에 대한 정보를 제공하지 않습니다. 그러나 그들은 같은 내용을 보고했습니다./proc/PID/fdstat정보는fstat파일을 연 프로세스가 보고되므로 파일이 있는 파일 시스템과 해당 inode 번호를 확인할 수 있습니다. 디렉토리는 심볼릭 링크로 표시되지만 따라가기만 하고 readlink빈 문자열을 반환 할 수 있는 마법의 심볼릭 링크입니다 .

AIX에서는procfiles이 명령은 프로세스에서 연 파일에 대한 일부 정보를 표시합니다. 솔라리스에서는pfiles이 명령은 프로세스에서 연 파일에 대한 일부 정보를 표시합니다. 여기에는 파일 경로가 포함되지 않습니다(Solaris에서는 Solaris 10부터 시작됩니다. 아래 참조).

솔라리스(부터버전 10)

또한 최신 Solaris 버전에는 Linux와 유사한 기호 링크가 포함되어 있습니다. 이것/proc/PID/fd/NUM/proc/PID/path/NUM/proc/PID/fd/NUMpfiles이 명령은 경로를 포함하여 프로세스의 열린 파일에 대한 정보를 표시합니다.

계획 9

/proc/PID/fd프로세스에서 연 각 파일 설명자에 대한 하나의 레코드(라인)를 포함하는 텍스트 파일입니다. 파일 이름은 추적되지 않습니다.

QNX

/proc/PID/디렉토리이지만 파일 설명자에 대한 정보는 포함되어 있지 않습니다.

Unices는 /proc파일 설명자에 직접 액세스할 수 있지만 직접 액세스할 수는 없습니다.

(참고: 때때로 에서 액세스할 수 있는 메모리 이미지를 검색하여 프로세스에서 연 파일에 대한 정보를 얻는 것이 가능합니다 /proc. 저는 이 "직접 액세스"를 고려하지 않습니다.)

Unices 파일은 어디에 있습니까?/proc/PID

proc 파일 시스템 자체시작UNIX 버전 8에서는 구조가 다르지만 Plan 9를 거쳐 일부 unice로 돌아갔습니다. PID가 있는 모든 운영 체제에는 /proc각 PID에 대한 항목이 있지만 많은 시스템에서는 디렉터리가 아닌 일반 파일입니다. 다음 시스템에는 읽어야 할 시스템이 있습니다./proc/PIDioctl

  • 솔라리스 건담2.5
  • 이제 OSF/1이 호출됩니다.트루64
  • 에릭스(?)
  • SCO(?)

미니 3

MINIX 3에는프로세스 서버디렉터리를 포함하여 여러 Linux와 유사한 구성 요소를 제공합니다. 하지만./proc/PID//proc/PID/fd

FreeBSD

FreeBSD에는 디렉토리가 있지만 열린 파일 설명자에 대한 정보는 제공하지 않습니다. (그러나 심볼릭 링크를 통해 실행 파일에 액세스할 수 있는 Linux와 유사한 것이 있습니다.)/proc/PID//proc/PID/file/proc/PID/exe

FreeBSD의 procfs는 다음과 같습니다.더 이상 사용되지 않음.

통일은 없어/proc

  • HP-UX
  • 오픈BSD
  • 네트워크BSD
  • 맥 OS X

다른 채널을 통해 파일 설명자 정보 얻기

퓨저

이것fuser이 명령은 지정된 마운트 지점에서 지정된 파일을 여는 프로세스를 나열합니다. 이 명령은 표준 명령입니다(모든 명령에 적용됨).XSI- 호환 가능한 시스템(예: X/Open 시스템 인터페이스 확장이 포함된 POSIX)

이 유틸리티를 사용하여 프로세스 이름에서 파일 이름으로 이동할 수 없습니다.

사랑

Lsof는 "열린 파일 목록"을 나타냅니다. 이것은타사 도구, 대부분의 UNIX 변형에서 사용할 수 있습니다(그러나 일반적으로 기본 설치에는 포함되지 않음). 열린 파일에 대한 정보를 얻는 것은 위의 분석으로 인해 의심스러울 수 있으므로 시스템에 따라 매우 다릅니다. lsof 관리자는 이 모든 것을 하나의 인터페이스로 결합하는 훌륭한 작업을 수행했습니다.

당신은 읽을 수있다자주하는 질문LSof가 어떤 어려움을 견뎌야 하는지 확인해 보세요. 대부분의 unice에서 열린 파일의 이름에 대한 정보를 얻으려면 커널 데이터 구조를 구문 분석해야 합니다. FAQ 3.3 "lsof가 전체 경로 이름을 보고하지 않는 이유는 무엇입니까?" 인용:

Lsof는 다음 방언에 대해 커널 이름 캐시에서 경로 이름 구성 요소를 얻을 수 없습니다.

  • 엑스

Linux 커널만이 열린 파일에 대해 유지 관리하는 구조에 전체 경로 이름을 기록합니다. 대신 대부분의 커널은 경로 이름을 장치 및 노드 번호 이중 문자로 변환하고 파일이 열린 후 후속 파일 참조에 사용합니다.

lsof의 출력에서 ​​정보를 구문 분석 해야 하는 경우 -F패턴(한 줄에 하나의 필드)을 사용해야 하며 -F0패턴(널로 구분된 필드)을 사용하는 것이 좋습니다. 특정 프로세스의 특정 파일 설명자에 대한 정보를 얻으려면 -a예를 들어 및 옵션을 사용하십시오.-p PID-d NUMlsof -a -p 123 -d 0 -F0n

/dev/fd/NUM현재 프로세스에 대한 파일 설명자

많은 UNIX 변형은 프로세스가 파일 이름으로 열린 파일에 액세스하는 방법을 제공합니다. open은 호출과 동일합니다./dev/fd/NUMdup(NUM). 이는 프로그램에 파일 이름이 필요하지만 구현된 셸과 같이 이미 열려 있는 파일(예: 파이프 또는 소켓)을 전달하려는 경우 유용합니다.프로세스 교체가능한 경우 이를 사용하십시오. 그렇지 않은 경우에는 임시 명명된 파이프를 사용하십시오 /dev/fd.

동의어(때로는 기호 링크, 때로는 하드 링크, 때로는 동등한 속성을 가진 매직 파일)가 일반적으로 (항상?) 존재하는 곳에서 /dev/fd사용됩니다 /dev/stdin= /dev/fd/0, /dev/stdout= /dev/fd/1, /dev/stderr= /dev/fd/2.

  • Linux에서는 /dev/fd에 대한 심볼릭 링크입니다 /proc/self/fd.
  • 대부분의 유닉스(아이릭스,오픈BSD,네트워크BSD, SCO,솔라리스, …)의 항목은 /dev/fd문자 장치입니다. 일반적으로 파일 설명자가 열려 있는지 여부에 관계없이 나타나며 특정 수 이상의 파일 설명자에 대해서는 항목을 사용하지 못할 수 있습니다.
  • FreeBSD와 OSX에서는fdescfs파일 시스템은 /dev/fd호출 프로세스의 열린 설명자를 따르는 동적 디렉터리를 제공합니다. 설치되지 않은 경우 /dev/fd정적으로 사용할 수 있습니다./dev/fd
  • OSF/1(Tru64)에서 다음을 /dev/fd제공합니다 .FDFS.
  • /dev/fdAIX 또는 HP-UX에서는 사용할 수 없습니다.

답변2

그것이 제공하는 구현 /proc과 기능은 어떤 방식으로든 표준화되지 않았습니다.여기. Wikipedia에 따르면 FreeBSD는 "단계적으로 폐지"되고 있습니다 /proc.여기에서 자세히 알아보세요.

현재로서는 /devPOSIX /dev/fd/또는 단일 사용자 사양(SUSv3)의 일부가 아니지만 System V 및 BSD는 이를 지원합니다.

부록:

리눅스: /dev/fd/*그렇습니다 /proc/self/fd.

FreeBSD: /dev/fd/*fdescfs를 통해 제공됩니다.

NetBSD: FreeBSD와 동일합니다.

OpenBSD: FreeBSD와 동일합니다.

솔라리스: 그렇습니다 /dev/fd/*.

IRIX: 네 /dev/fd/*.

Tru64 Unix: /dev/fd/*정당화됨nixdoc.net, HP의 정품 Tru64 설명서는 혼란스럽습니다(맙소사, 정말 엉망입니다! 아무것도 찾지 못했습니다!).

AIX: 공개 문서에 표시가 없습니다.

HP-UX: AIX와 동일합니다.

관련 정보