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


20

난 항상이 궁금하지만, 찾을 수있는 시간이 걸리지 않았다 내가 지금 그렇게 할 것이다, 그래서 적이 - 어떻게 휴대가 사용이되어 여기에 표시된 하나의 /proc/$$/fd/$N/dev/fd/$N? POSIX 보증을 이해 /dev/null, /dev/tty, and /dev/console 하지만 ( 이 답변 에 대한 의견을 읽은 후 다른 날에 만 알았지 만 ) 다른 사람들은 어떻습니까?

지금까지 내가 그들에게있는 거 꽤 흔한 말,하지만 시스템의 수 나는 할 수 없습니다 찾을 것으로 기대? 왜 안돼? 다른 것을 찾을 가능성이 더 높습니까? 그것들은 항상 같은 속성을 보여줍니까?

나는이 장치들을 모든 방식으로 꽤 광범위하게 사용하는 경향이 있으며, 단지 시도 만해도 문제가 발생할 가능성이 있는지 알고 싶습니다.

또한 위의 질문은 내가 것만으로 이해되어야한다 생각 나는 분명 처음에 요청해야하기 때문에, 나는이 점에서 가장 잘 알고하지 않을 수 있습니다, 내가 알고 싶습니다,하지만 그들은 엄격한 요구 사항을 고려되어서는 안된다 답변. 당신이 할 수있는 경우에 단서.

답변:


27

심볼릭 링크는 준 보편적 인 리눅스,하지만 그들은 (을 에뮬레이트 Cygwin에서 제외) 다른 곳에서는 존재하지 않는다. AIX 및 Solaris에도 존재하지만 심볼릭 링크는 아닙니다. 오픈 파일에 대한 정보를 얻으려면 설치하십시오 ./proc/PID/fd/NUM/proc/PID/fd/NUMlsof

와 함께 Unices /proc/PID/fd

리눅스

Linux에서, ID PID 가 있는 프로세스가 파일 디스크립터 NUM 에서 연 파일에 대한 약간의 마술 기호 링크 입니다. 이 링크는 예를 들어 파일이 제거 된 경우에도 파일에 액세스하는 데 사용될 수 있다는 점에서 마술입니다. 링크도 이름 변경을 통해 파일을 추적합니다. 가리키는 마법의 심볼릭 링크 여기서 PID는 링크에 액세스하는 과정은./proc/PID/fd/NUM/proc/self/proc/PID

이 기능은 거의 모든 Linux 시스템에 있습니다. 그것은 proc 파일 시스템 의 드라이버에 의해 제공되며 기술적으로 선택 사항이지만 임베디드 시스템에서도 거의 빠지지 않는 많은 작업 ( ps작업 수행 포함 )에 사용됩니다./proc/PID

시그윈

Cygwin은 Linux (Cygwin 프로세스 용) 및을 에뮬레이트합니다 ./proc/PID/fd/NUM/proc/self

Solaris (버전 2.6부터), AIX

각 파일 디스크립터에 대한 항목 이 있지만 열린 파일과 동일한 유형으로 표시되므로 파일 경로에 대한 정보를 제공하지 않습니다. 그러나 파일을 연 프로세스에 보고하는 것과 동일한 정보를 보고하므로 파일이있는 파일 시스템과 inode 번호를 확인할 수 있습니다. 디렉토리는 심볼릭 링크로 표시되지만 따라야 만 할 수있는 마법 심볼릭 링크 이며 빈 문자열을 반환합니다./proc/PID/fdstatfstatreadlink

AIX에서 procfiles명령은 프로세스의 열린 파일에 대한 일부 정보를 표시합니다. Solaris에서이 pfiles명령은 프로세스의 열린 파일에 대한 일부 정보를 표시합니다. 여기에는 파일 경로가 포함되어 있지 않습니다 (Solaris에서는 Solaris 10 이후에 아래 참조).

Solaris ( 버전 10 부터 )

이외에도 최신 Solaris 버전에는 Linux의 심볼릭 링크와 유사한 심볼릭 링크가 포함되어 있습니다 . 이 명령은 경로를 포함하여 프로세스의 열린 파일에 대한 정보를 보여줍니다./proc/PID/fd/NUM/proc/PID/path/NUM/proc/PID/fd/NUMpfiles

계획 9

/proc/PID/fd프로세스에 의해 열린 파일 디스크립터 당 하나의 레코드 (라인)를 포함하는 텍스트 파일입니다. 파일 이름은 추적되지 않습니다.

QNX

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

/proc파일 디스크립터에 직접 액세스하지는 않는 Unices

(참고 : 때로는 아래에서 액세스 할 수있는 메모리 이미지를 통해 프로세스의 열린 파일에 대한 정보를 얻을 수도 있습니다 /proc. "직접 액세스"로 계산하지 않습니다.

파일이있는 Unices/proc/PID

proc 파일 시스템 자체 UNIX 8th Edition에서 시작 되었지만 다른 구조로 계획 9를 거쳐 유니스로 돌아갔습니다. 필자 /proc는 PID가있는 모든 운영 체제 에 각 PID에 대한 항목이 있다고 생각 하지만 많은 시스템에서 디렉토리가 아닌 일반 파일입니다. 다음 시스템을 읽어야합니다 ./proc/PIDioctl

  • 솔라리스 최대 2.5
  • OSF / 1 해주기로 알려진 의 Tru64
  • IRIX (?)
  • SCO (?)

MINIX 3

MINIX 3에는 디렉토리를 포함하여 여러 Linux와 같은 구성 요소를 제공 하는 procfs 서버 가 있습니다. 그러나 이것은 없습니다 ./proc/PID//proc/PID/fd

FreeBSD

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

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

없는 유니스 /proc

  • HP-UX
  • OpenBSD
  • NetBSD
  • 맥 OS X

다른 채널을 통한 파일 디스크립터 정보

퓨저

fuser명령은 지정된 파일이 열려 있거나 지정된 마운트 지점에서 파일이 열려있는 프로세스를 나열합니다. 이 명령은 표준입니다 (모든 XSI 호환 시스템, 즉 X / Open System Interface Extension이있는 POSIX에서 사용 가능).

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

Lsof

Lsof는 "목록 열기 파일"을 나타냅니다. 그것은이다 타사 도구 유닉스 변종 대부분에 해당하는 (그러나 보통 기본 설치의 일부). 위의 분석으로 의심 스러울 수 있으므로 열린 파일에 대한 정보를 얻는 것은 시스템에 따라 매우 다릅니다. lsof 관리자는 단일 인터페이스에서 모두 결합하는 작업을 수행했습니다.

FAQ 를 읽고 lsof가 어떤 어려움을 겪고 있는지 확인할 수 있습니다 . 대부분의 유니스에서 열린 파일 이름에 대한 정보를 얻으려면 커널 데이터 구조를 구문 분석해야합니다. FAQ에서 인용 3.3“왜 전체 경로 이름을보고하지 않습니까?”:

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

  • AIX

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

lsof의 출력 에서 정보를 구문 분석해야하는 경우 -F모드 (라인 당 하나의 필드), 바람직하게는 -F0모드 (널 구분 필드)를 사용하십시오. 특정 프로세스의 특정 파일 기술자에 대한 정보를 얻으려면 사용 -a과 옵션 및 예를 .-p PID-d NUMlsof -a -p 123 -d 0 -F0n

/dev/fd/NUM 현재 프로세스의 파일 디스크립터

많은 유닉스 변형은 프로세스가 파일 이름을 통해 열린 파일에 액세스하는 방법을 제공합니다. 여는 것은 호출과 같습니다 . 이 이름은 프로그램이 파일 이름을 원하지만 이미 열린 파일 (예 : 파이프 또는 소켓)을 전달하려는 경우에 유용합니다. 예를 들어 프로세스 대체 를 구현하는 셸은 사용 가능한 경우 ( 사용할 수없는 임시 명명 된 파이프 사용) 사용합니다./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입니다.
  • 대부분의 유니스 ( IRIX , OpenBSD , NetBSD , SCO, Solaris 등)에서 항목 /dev/fd은 문자 장치입니다. 일반적으로 파일 디스크립터가 열려 있는지 여부에 따라 표시되며 특정 숫자 이상의 파일 디스크립터에 대해서는 항목을 사용하지 못할 수 있습니다.
  • FreeBSD 및 OSX에서 fdescfs 파일 시스템은 /dev/fd호출 프로세스의 열린 디스크립터를 따르는 동적 디렉토리를 제공합니다 . 정적 /dev/fd은 사용 가능 /dev/fd하지 않습니다.
  • OSF / 1 (Tru64)에서 fdfs/dev/fd 를 통해 제공됩니다 .
  • /dev/fdAIX 또는 HP-UX 에는 없습니다 .

Solaris에 대한 귀하의 진술은 약간 구식입니다. 10 년 미만의 Solaris 릴리스에서는 pfiles명령에 파일 설명자 경로가 표시됩니다. /proc/<pid>/path또한 언급 할 수 있는 디렉토리 에서이 정보를 검색합니다 . 참조 docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.html
jlliagre

9

방법 /proc이 구현되고 제공되는 기능이 어떤 방식 으로든 표준화되지 않았습니다 (예 : here 참조) . Wikipedia에 따르면 FreeBSD는 "폐기 중" 입니다. 자세한 내용/proc여기를 참조하십시오 .

현재 /dev, /dev/fd/POSIX의 일부 또는 사양 (가 SUSv3) 시스템 V와 BSD가이를 지원하면서 단일 사용자 없습니다.

추가:

Linux :에 /dev/fd/*대한 심볼릭 링크 /proc/self/fd입니다.

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

NetBSD : FreeBSD와 동일합니다.

OpenBSD : FreeBSD와 동일합니다.

솔라리스 : /dev/fd/*.

IRIX : 있습니다 /dev/fd/*.

Tru64 Unix : nixdoc.net/dev/fd/* 에 따르면 HP의 정품 Tru64 문서는 다루기 어렵습니다 (소년, 엉망! 아무것도 찾지 못합니다!).

AIX : 공개적으로 사용 가능한 문서에서 표시가 없습니다.

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


그래서 나는 /dev/fd/1현재와 ​​연결되는 BSD에서 찾을 수 1>있습니까? 내가 리눅스에서 일반적으로하는 한 가지는 echo 'command' | . /dev/fd/0-이런 종류의 일이 전반적으로 작동 할 가능성이 있다는 것입니다.
mikeserv

지금은 BSD 시스템에 액세스 할 수 없지만 그렇게 이해합니다. 예.
countermode

1
조금만 더 확장 할 시간을 찾으면이 답변을 받아 들일 것입니다. 놀라운 교수진 게시물을 제외하고 생각합니다. 어쨌든 첫 번째로 연결된 기사는 깨달은 독서였습니다. 대단히 감사합니다.
mikeserv

네. 교수님 fd가 결국 나타난 것 같아요? 그럼 다음에 더 나은 행운이 있습니까?
mikeserv

1
그럼 Linux : / dev / fd / *는 / proc / self / fd에 대한 심볼릭 링크입니다. FreeBSD : / dev / fd / *는 fdescfs를 통해 제공됩니다. NetBSD : FreeBSD와 동일합니다. OpenBSD : FreeBSD와 동일합니다. Solaris : / dev / fd / *가 있습니다. IRIX : / dev / fd / *가 있습니다. Tru64 Unix : / dev / fd / *가 있습니다 ( nixdoc.net 에 따르면 HP의 정품 Tru64 문서는 불가피 합니다). AIX : 공개적으로 사용 가능한 문서에서 표시가 없습니다. HP-UX : AIX와 동일합니다.
countermode
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.