/ proc / PID / fd / X 링크 번호


36

Linux에서의 /proc/PID/fd/X파이프 또는 소켓 인 파일 디스크립터에 대한 링크에는 다음과 같은 숫자가 있습니다.

l-wx------ 1 user user 64 Mar 24 00:05 1 -> pipe:[6839]
l-wx------ 1 user user 64 Mar 24 00:05 2 -> pipe:[6839]
lrwx------ 1 user user 64 Mar 24 00:05 3 -> socket:[3142925]
lrwx------ 1 user user 64 Mar 24 00:05 4 -> socket:[3142926]
lr-x------ 1 user user 64 Mar 24 00:05 5 -> pipe:[3142927]
l-wx------ 1 user user 64 Mar 24 00:05 6 -> pipe:[3142927]
lrwx------ 1 user user 64 Mar 24 00:05 7 -> socket:[3142930]
lrwx------ 1 user user 64 Mar 24 00:05 8 -> socket:[3142932]
lr-x------ 1 user user 64 Mar 24 00:05 9 -> pipe:[9837788]

첫 번째 줄 에서처럼 : 6839. 그 숫자는 무엇을 나타 냅니까?

답변:


36

해당 파이프 또는 소켓 의 inode 번호입니다.

파이프는 쓰기 끝과 읽기 끝이있는 단방향 채널입니다. 예를 들어, inode 번호가 동일하기 때문에 FD 5와 FD 6이 서로 대화하는 것처럼 보입니다. (그렇지 않을 수도 있습니다. 아래를 참조하십시오.)

파이프를 통해 프로그램이 대화하는 것을 보는 것보다 일반적으로 쉘과 함께 파이프를 설정하기 때문에 서로 대화하는 한 쌍의 개별 프로그램이 있습니다.

shell-1$ ls -lR / | less

그런 다음 다른 터미널 창에서 :

shell-2$ ...find the ls and less PIDs with ps; say 4242 and 4243 for this example...
shell-2$ ls -l /proc/4242/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 1 -> pipe:[222536390]
shell-2$ ls -l /proc/4243/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 0 -> pipe:[222536390]

이는 PID 4242의 표준 출력 (일반적으로 FD 1)이 inode 번호가 222536390 인 파이프에 연결되어 있고 PID 4243의 표준 입력 (FD 0)이 동일한 파이프에 연결되어 있음을 나타냅니다.

이는 모든 것을 말하는 긴 방법 ls의 출력에 전송되는 less의 입력 '.

FD 1과 FD 2는 거의 확실하게 서로 대화 하지 않습니다 . 이것은 아마도 stdout (FD 1)과 stderr (FD 2)를 함께 묶은 결과이므로 둘 다 동일한 목적지로갑니다. Bourne 쉘을 사용하여 다음과 같이 할 수 있습니다.

$ some-program 2>&1 | some-other-program

따라서 in을 둘러 /proc/$PID_OF_SOME_OTHER_PROGRAM/fd보면 some-program인스턴스의 FD 1 및 2에 연결된 것과 동일한 inode 번호를 가진 파이프에 세 번째 FD가 연결되어 있습니다. 이것은 귀하의 예에서 FD 5와 6에서 일어나는 일 일 수도 있지만,이 두 FD가 어떻게 묶여 있는지에 대한 준비된 이론이 없습니다. 내부적으로 프로그램이 무엇을하고 있는지 알고 있어야합니다.


1
예를 들어, pidgin파이프와 소켓 등이 많았 기 때문에 좋은 예라고 생각합니다. 마지막 질문 : inode는 특정 파일 시스템의 상황에서만 특정됩니다. 마찬가지로 /파일 시스템 에 inode 3을, 파일 시스템에 다른 (다른) inode 3을 가질 수 있습니다 /boot.
Thanatos

4
예. 의 경우 /proc파일 시스템, 아이 노드 번호는 바로 비행 (참조에 만들어집니다 get_next_ino()fs/inode.c시스템이 새로 부팅 될 때 0에서 시작하여, 커널에서). 그것들을 구성하는 메커니즘은 POSIX 시맨틱이 그것을 요구하지 않더라도 inode 번호 고유 한 Linux의 여러 필수 파일 시스템 (proc, configfs, ramfs, autofs ...)에 의해 공유됩니다 . 그러나 이것은 다소 특별한 경우입니다. 당신이 말하는 규칙은 일반적으로 ext3과 같은 일반적인 영구 파일 시스템과 관련하여 참조됩니다.
워렌 영

33

소켓의 경우 당신은에서 아이 노드에 대한 자세한 정보를 찾을 수 있습니다 /proc/net/tcp, /proc/net/udp또는 /proc/net/unix. 예를 들면 다음과 같습니다.

ls -l /proc/<pid>/fd
lrwx------ 1 root root 64 May 26 22:03 3 -> socket:[53710569]

우리는 inode가 53710569임을 알 수 있습니다.

head -n1 < tcp ; grep -a 53710569 tcp
sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                   
155: 0100007F:001B 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0        0 53710569 1 ffff88011f52c200 300 0 0 2 -1

이 경우 로컬 포트 ​​27 (0x1B)에서 수신 대기하는 청취 소켓 (원격 주소 없음)입니다. IP 주소는 "네트워크 표기법"에서 16 진수로 4 바이트이며 inet_ntoa표준 abcd 표기법 (이 경우 127.0.0.1)으로 변환 하는 기능을 사용할 수 있습니다 .

이 파일은 0 바이트 인 것처럼 보이지만 내용을 읽으면 내용이 있습니다. 또한 -agrep은 (예를 들어로 unix) 이진으로 나타날 수 있으므로 필요합니다.


도 있습니다 /proc/net/tcp6/proc/net/udp6IPv6를 위해.
Craig McQueen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.