我不认为它们已经关闭,因为我希望在 close() 之后 fd 会消失,但我看到一堆挥之不去的 fd -> socket[xxxxx] 条目,其符号链接已损坏,这似乎不是快点走开。是什么原因导致这种状态呢?
答案1
符号链接目标的文本不是指文件,而是指/proc/net/tcp
表中使用编码文本字段描述每个套接字的条目。例如,在我的系统上,我现在看到:
$ ls -l /proc/24724/fd/7
lrwx------ 1 vagrant vagrant 64 Feb 13 15:08 /proc/24724/fd/7 -> socket:[19164451]
对应于tcp
表中的这一行:
$ grep 19164451 /proc/net/tcp
433: 0100007F:C8AA 0100007F:0C8A 01 00000000:00000000 02:00000286 00000000 1000 0 19164451 2 0000000000000000 20 4 1 10 27
一些快速的谷歌搜索应该可以帮助您找到大量用于解码这些行的资源。两个例子:
http://www.onlamp.com/pub/a/linux/2000/11/16/LinuxAdmin.html https://stackoverflow.com/questions/5992211/list-of-possible-internal-socket-statuses-from-proc
如果您想要一个为您处理它们的工具,那么如果您使用该选项告诉它读取所有链接以了解哪些进程属于哪些套接字,那么netstat
您就会这样做。尝试:-p
/proc
fd
netstat -tuapn
答案2
socket[xxxxx] 符号链接总是损坏。没有可以访问的路径来打开具有给定索引节点号的套接字。
我尝试了一下,似乎无法打开/proc/pidX/fd/Y
引用套接字的文件。但是,如果它引用真实文件,即使该文件已被删除,您也可以这样做。它不完全是一个符号链接。它很神奇——即一种特殊情况。