關於/proc/$pid/fd socket:[number]

(轉載自: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爲基準。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章