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

(轉載自: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

相關文章
相關標籤/搜索