linux 控制代碼相關知識

2021-10-07 14:08:09 字數 3653 閱讀 1223

控制代碼的介紹及應用

控制代碼是在 windows 中引入的乙個概念,它是和物件一一對應的 32 位無符號整數值。控制代碼可以對映到唯一的物件,它是處理物件的乙個介面,對於所涉及的物件,可以通過相應的控制代碼來操作它。控制代碼的引入主要是作業系統為了避免應用程式直接對某個物件的資料結構進行操作為目的,用操作控制代碼來代替操作物件。

在 linux 環境中,任何事物都是用檔案來表示,裝置是檔案,目錄是檔案,socket 也是檔案。用來表示所處理物件的介面和唯一介面就是檔案。應用程式在讀 / 寫乙個檔案時,首先需要開啟這個檔案,開啟的過程其實質就是在程序與檔案之間建立起連線,控制代碼的作用就是唯一標識此連線。此後對檔案的讀 / 寫時,目標檔案就由這個控制代碼作為代表。最後關閉檔案其實就是釋放這個控制代碼的過程,使得程序與檔案之間的連線斷開。

lsof -n|

awk''

|sort

|uniq -c|

sort -nr|

more

#第一列是開啟的控制代碼數,第二列是程序id

1>執行 ps -ef | grep 程序名稱

2>執行 ls -l /proc/程序id/fd | wc -l ,檢視控制代碼數量

# cat /proc/sys/fs/file-max
#檢視top 10 程序控制代碼數

lsof -n|

awk''

|sort

|uniq -c|

sort -nr |

head -n 10

控制代碼洩露

造成控制代碼洩露的主要原因,是程序在呼叫系統檔案之後,沒有釋放已經開啟的檔案控制代碼。在 linux 系統中,程序與檔案之間是通過「開啟檔案」操作建立連線,檔案系統會返回檔案控制代碼來唯一標識程序與檔案的連線。每當乙個程序執行完畢之後,linux 系統會將與程序相關的檔案控制代碼自動釋放。但是,如果程序一直處於執行狀態,檔案的控制代碼只能通過「關閉檔案」操作來自我釋放。與 windows 系統的設定不同,linux 系統對程序可以呼叫的檔案控制代碼數做了限制,在預設情況下,每個程序可以呼叫的最大控制代碼數為 1024 個。超過了這個數值,程序則無法獲得新的控制代碼。因此,控制代碼的洩露將會對程序的功能失效造成極大的隱患。

如何修改系統最大控制代碼數

linux 中,單個程序能夠開啟的最大檔案控制代碼數量是可以配置的,系統預設是 1024。當單個程序開啟的檔案控制代碼數量超過了系統定義的值,就會出現「too many files open」的錯誤提示。使用者可以通過以下命令檢視系統定義的最大值:

ulimit – n
檢視當前程序開啟了多少控制代碼數:

# lsof -n|awk ''|sort|uniq -c|sort -nr|more

131 24204 

57 24244

其中第一列是開啟的控制代碼數,第二列是程序id。可以根據id號來檢視程序名:

# ps aef|grep 24204

nginx  24204 24162 99 16:15 ?    00:24:25 /usr/local/nginx/sbin/nginx -s

對於一般的應用程式而言 1024 已經完全夠用了,但是有些程序處理大量請求,很有可能 1024 就不夠用了,則需要調整系統引數,來適應應用的變化。linux 有硬性和軟性設定兩種,都可以通過 ulimit 來設定。例如

ulimit – hsn 2048

以上命令就可以設定 h(硬性),s(軟性)的值為 2048。n表示設定單個程序最大的開啟檔案控制代碼數量。個人覺得最好不要超過4096,畢竟開啟的檔案控制代碼數越多響應時間肯定會越慢。設定控制代碼數量後,系統重啟後,又會恢復預設值。如果想永久儲存下來,可以修改.bash_profile檔案,可以修改 /etc/profile 把上面命令加到最後。

linux 檢測控制代碼的方法

在 linux 平台上,lsof(list open files)是乙個列出當前系統開啟檔案的工具。在 linux 環境下,任何事物都以檔案的形式存在,系統在後台為應用程式分配了乙個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用介面。因為應用程式開啟檔案的描述符列表提供了大量關於這個應用程式本身的資訊,因此通過 lsof 工具能夠檢視這個列表對系統監測以及排錯將是很有幫助的。

在終端下輸入 lsof 即可顯示系統開啟的檔案,因為 lsof 需要訪問核心記憶體和各種檔案,所以必須以 root 使用者的身份執行它才能夠充分地發揮其功能。螢幕顯示如下:

command     pid    user   fd      type     device      size       node name 

init 1 root cwd dir 3,2 4096 2 /

init 1 root rtd dir 3,2 4096 2 /

init 1 root txt reg 3,2 32684 1200637 /sbin/init

……

lsof 輸出各列資訊的意義如下:

command:程序的名稱

pid:程序識別符號

user:程序所有者

fd:檔案描述符,應用程式通過檔案描述符識別該檔案。如 cwd、txt 等 type:檔案型別,如 dir、reg 等

device:指定磁碟的名稱

size:檔案的大小

node:索引節點(檔案在磁碟上的標識)

name:開啟檔案的確切名稱

在 linux 系統中可以用 man lsof 檢視詳細的介紹和引數使用方法,在這裡不作過多介紹。在偵測程式控制程式碼洩露的應用中,我們主要用到 lsof 的如下使用方法:

lsof – p pid
pid 是指我們要偵測程式的程序號,可以用命令 ps – ef 來得到。我們以程序號 14946 為例:

# lsof -p 14946 

command pid user fd type device size node name

rpc.rquot 14946 root cwd dir 3,2 4096 2 /

rpc.rquot 14946 root rtd dir 3,2 4096 2 /

rpc.rquot 14946 root txt reg 3,2 65292 267543

/usr/sbin/rpc.rquotad

rpc.rquot 14946 root mem reg 3,2 45889 535442

/lib/libnss_files-2.3.4.so

rpc.rquot 14946 root mem reg 3,2 1454802 541622 /lib/tls/

libc-2.3.4.so

……

每一行就代表該程序正在使用的乙個檔案,即控制代碼。統計行數總和就是該程序開啟的所有控制代碼數量,這為我們用統計方法偵測控制代碼洩露提供的依據。

linux 相關知識

一 shell的基本概念 shell是作業系統中執行的程式 位於作業系統核心和使用者之間 shell定義使用者與os程序互動的乙個介面,命令直譯器 二 shell的分類 種類 bsh csh ksh bash bash是linux的預設shell bash是bsh的公升級替代品 tcsh是csh的相...

Linux相關知識

1 安裝五筆 sudo apt get install ibus ibus table ibus table wubi2 linux如何切換到root使用者 預設安裝完成之後並不知道root使用者的密碼,那麼如何應用root許可權呢?1 sudo 命令 這樣輸入當前管理員使用者密碼就可以得到超級使用...

Linux相關知識

一 關於目錄 根目錄bin binary 二進位制檔案 可執行檔案 放一些作業系統的命令 dev device 裝置 裝置檔案 存放裝置檔案 lib library 庫 存放庫檔案 mint mount 掛載目錄 root root 使用者的夾目錄 bin binary 存放二進位制檔案 可執行檔案...