(轉載自:https://blog.csdn.net/lkkey80/article/details/16856063)
衆所周知,在相應進程的/proc/$pid/fd 目錄下存放了此進程所有打開的fd。當然有些可能不是本進程自己打開的,如通過fork()從父進程繼承而來的。本文着着重講述socket有關的內容。當我們在fd目錄下使用 ls -l 命令查看時,會看到諸如下面的內容:
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的inode號。從linux內核代碼net/socket.c 中可以看出,如下
/*
* 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);
}
那麼,知道了某個進程打開的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
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
注:本文中涉及的代碼以linux 2.6.30.1爲基準。