閱讀995 返回首頁    go 阿裏雲 go 技術社區[雲棲]


文件句柄備忘

句柄是什麼?

Handle本身是一個32位的無符號整數,它用來代表一個內核對象。它並不指向實際的內核對象。
句柄不是指針,但利用句柄能夠得到一段內存地址,
句柄的設計目標是防止用戶隨意修改內核中文件,因此用戶模式下的程序永遠不可能獲得一個內核對象的實際地址(一般情況下)。

那麼Handle的意義何在?
它實際上是作為一個索引在一個表中查找對應的內核對象的實際地址。

那麼這個表在哪裏呢?
每個進程都有這樣的一個表,叫句柄表。
該表的第一項就是進程自己的句柄,這也是為什麼你調用GetCurrentProcess()總是返回0x7FFFFFFF原因。

簡單地說,Handle就是一種用來"間接"代表一個內核對象的整數值。你可以在程序中使用handle來代表你想要操作的內核對象。這裏的內核對象包括:事件(Event)、線程、進程、Mutex等等。我們最常見的就是文件句柄(file handle)。

 

linux 中通常默認都隻能夠同時打開 1024 個文件。

通常 linux 係統中文件打開的設定分成係統級別設定及用戶級別設定
常見的文件限製令係統產生下麵錯誤
 Socket/File: Can‘t open so many files

係統級別定義方法
 /etc/sysctl.conf 或 /proc/sys/fs/file-max

用戶級別定義方法
 /etc/security/limits.conf 或 ulimit 命令

 


查詢進程打開文件的方法, 以當前 ssh 鏈接到服務器的終端作為例子, 先查詢到進程號

ps aux | grep pts/0 | grep ssh | grep -v grep | awk '{print $2}'
1859

利用 lsof 查詢當前進程打開的文件數量 
lsof -p 1859  | wc -l (直接查詢當前進程)
59

lsof -n | grep 1859 | wc -l  (查詢整個係統中打開的文件再執行過濾)
58


查詢某個文件被什麼進程使用中的方法

lsof -f -- /lib/security/pam_keyinit.so
COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
login   1019 root mem    REG    8,1     5740 133255 /lib/security/pam_keyinit.so
sshd    1859 root mem    REG    8,1     5740 133255 /lib/security/pam_keyinit.so
sshd    4468 root mem    REG    8,1     5740 133255 /lib/security/pam_keyinit.so


查詢分區打開文件方法
[root@station11 proc]# lsof +f -- /dev/sda1 | head -5
COMMAND    PID      USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
init         1      root  cwd    DIR    8,1     4096      2 /
init         1      root  rtd    DIR    8,1     4096      2 /
init         1      root  txt    REG    8,1   145180 139646 /sbin/init
init         1      root  mem    REG    8,1   122232 162307 /lib/libgcc_s-4.4.5-20110214.so.1

最後更新:2017-04-03 21:30:11

  上一篇:go Android Service和廣播聯合更新UI的例子
  下一篇:go 有關Android中Service實現UI更新(Binder的運用)