文件句柄備忘
句柄是什麼?
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