/ proc / net / tcp를 모니터링하는 프로그램을 작성할 수 있으며 출력은 다음과 같습니다.
obi-wan ~ # cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4847458 1 e6060560 300 0 0 2 -1
1: 00000000:04D2 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4847477 1 f2e64da0 300 0 0 2 -1
2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7109 1 f2e65ac0 300 0 0 2 -1
3: 0100007F:177A 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000 0 4864457 1 d2726540 300 0 0 2 -1
4: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4847462 1 e60609c0 300 0 0 2 -1
5: 6B00A8C0:0016 30F4B5CA:C3AB 01 00000044:00000000 01:00000031 00000000 0 0 4982752 3 f2e64940 55 4 0 2 -1
6: 0100007F:B143 0100007F:BC5E 01 00000000:00000000 00:00000000 00000000 1000 0 2130283 1 d59cce40 21 4 1 2 -1
7: 0100007F:BC5E 0100007F:B143 01 00000000:00000000 00:00000000 00000000 1000 0 2130285 1 d59cd2a0 21 4 0 2 -1
8: 6B00A8C0:0016 3276C35B:8E11 01 00000000:00000000 02:000ADAB1 00000000 0 0 4982629 2 d2727260 40 4 8 2 2
9: 6B00A8C0:0016 6500A8C0:DD5D 01 00000538:00000000 01:00000029 00000000 0 0 4864416 5 e6061b40 42 12 27 3 -1
그런 다음 열린 포트를 inode에 연결할 수 있으며, 각 프로세스에 대해 나열된 파일 디스크립터에서 readlink를 수행하여 프로세스 및 파일 디스크립터와 다시 관련 될 수 있습니다.
obi-wan ~ # readlink /proc/28850/fd/3
socket:[4847458]
여기서 inode 4847458은 위 목록의 첫 번째 tcp 소켓에 해당합니다. netstat -tapn의 출력은 나를 위해 이것을 확인합니다 (0x50 == 80임을 상기하십시오).
obi-wan ~ # netstat -tapn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 28850/cherokee-work
모니터 프로그램이 / proc / net / tcp에서 변경 사항을 발견하면 데이터를 구문 분석하고 변경 사항이 새로 열린 소켓인지 판별하십시오. 그런 다음 / proc에 나열된 각 프로세스에 대한 모든 파일 설명자를 열거하고 각각에 대해 readlink를 수행하여 일치하는 inode를 찾을 수 있습니다. 일단 당신이 그것을 발견하면, 당신은 소유하고있는 pid를 가지고 있습니다.
즉각적인 알림이 필요하지 않으면 모니터 프로그램에서 느린 폴링 (아마도 50ms 또는 100ms 또는 1000ms)을 사용할 수 있습니다.