(转载自:https://blog.csdn.net/lkkey80/article/details/16856063)node
众所周知,在相应进程的/proc/$pid/fd 目录下存放了此进程全部打开的fd。固然有些可能不是本进程本身打开的,如经过fork()从父进程继承而来的。本文着着重讲述socket有关的内容。当咱们在fd目录下使用 ls -l 命令查看时,会看到诸以下面的内容: linux
lrwx------ 1 root root 64 Nov 21 09:44 133 -> /dev/sda1
lrwx------ 1 root root 64 Nov 21 09:44 134 -> /dev/sdb1
lrwx------ 1 root root 64 Nov 21 09:44 136 -> /dev/sdb1
lrwx------ 1 root root 64 Nov 21 09:44 137 -> socket:[22460]
lrwx------ 1 root root 64 Nov 21 09:44 138 -> socket:[7326842]
lrwx------ 1 root root 64 Nov 21 09:44 139 -> socket:[7341066]
socket
那么这个socket:后面的一串数字是什么呢?实际上是该socket的inode号。从linux内核代码net/socket.c 中能够看出,以下tcp
/*
* sockfs_dname() is called from d_path().
*/
static char *sockfs_dname(struct dentry *dentry, char *buffer, int buflen)
{
return dynamic_dname(dentry, buffer, buflen, "socket:[%lu]",
dentry->d_inode->i_ino);
}
ide
那么,知道了某个进程打开的socket的inode号后,咱们能够作什么呢?这就涉及到/proc/net/tcp(udp对应/proc/net/udp)文件了,其中也列出了相应socket的inode号经过比对此字段,咱们能在/proc/net/tcp下得到此套接口的其余信息,如对应的<本地地址:端口号,远端地址:端口号>对,窗口大小,状态等信息。具体字段含义详见net/ipv4/tcp_ipv4.c 中的 tcp4_seq_show 函数。cat /proc/net/tcp 以下:函数
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
ui
19: 0100007F:83B8 0100007F:A57D 01 00000000:00000000 00:00000000 00000000 0 0 10879 1 f622edc0 20 4 31 3 -1
20: 0100007F:0FA0 0100007F:AA06 01 00000000:00000000 00:00000000 00000000 0 0 7326842 1 f5504dc0 20 4 11 5 -1
spa
注:本文中涉及的代码以linux 2.6.30.1为基准。.net