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. 이 숫자는 무엇을 나타냅니까?
답변1
이것은인덱스 노드연결된 파이프 또는 배출구의 번호입니다.
파이프는 쓰기 끝과 읽기 끝이 있는 단방향 채널입니다. 귀하의 예에서는 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
따라서 를 살펴보면 /proc/$PID_OF_SOME_OTHER_PROGRAM/fd
파이프라인에 연결된 세 번째 FD가 인스턴스에 연결된 FD 1 및 2와 동일한 inode 번호를 갖고 있음을 알 수 있습니다 some-program
. 귀하의 예에서는 FD 5와 6에서도 이런 일이 발생할 수 있지만 이 두 FD가 어떻게 연결되는지에 대한 준비된 이론은 없습니다. 이를 알아내려면 프로그램 내부에서 무슨 일이 일어나고 있는지 알아야 합니다.
답변2
/proc/net/tcp
소켓의 경우 /proc/net/udp
, 또는 에서 inode에 대한 자세한 정보를 찾을 수 있습니다 /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바이트로 보이지만 읽어보면 내용이 있습니다. 또한 grep은 (예를 들어 ) 바이너리로 보일 -a
수 있으므로 이를 요구합니다 .unix