linux的man命令深入分析

2021-05-28 14:20:13 字數 3029 閱讀 6539

man有如下8個模組.

1 shell中使用者可用的命令

2 使用函式庫中程式可用的系統呼叫

3 程式中可用的庫函式

4 /dev目錄中可用的裝置

5 多種雜項系統檔案(ex:/etc/)

6 如果有的話,遊戲程式

7 雜項資訊

8 管理員可用的命令

1)man命令是如何搜尋命令對映的幫助檔案的?

2)幫助檔案的檔案格式和結構是怎麼的?

3)如何建立乙個man的幫助檔案?

4)whatis和apropos的執行流程是如何的呢?

第乙個問題:

man命令搜尋流程

第一步:$path變數指定的路徑

第二步:/etc/man.config檔案中manpath中指定的路徑

程式執行流程:

1)程式首先會試圖載入/etc/man.config檔案,將man.config的內容讀入記憶體,

2)將man.config檔案中"mansect         1:8:2:3:4:5:6:7:9:tcl:n:l:p:o"讀入到記憶體

mansect是man查詢的順序,例如上面的這個順序就是如果查到shell命令和系統呼叫,將優先列印shell命令

3)通過man.config和$path,確定出要搜尋的目錄

4)通過fstat系統呼叫,確認存在的目錄.

5)確定查詢到的命令/函式所對映的模組,例如sync命令的順序是1:8:2,可以通過man -a sync來確認

6)根據對映的模組找到對映man幫助檔案,這裡通過open開啟第4步中存在的目錄,依次查詢對映的幫助檔案(順序見man命令的搜尋流程)

第二個問題:

man程式讀取的幫助檔案格式分為兩大類.

第一類為troff程式編寫的源程式.

第二類為通過壓縮工具壓縮過的源程式.

man程式可以直接讀取的格式,是第一大類,和第二大類中用gzip壓縮的幫助檔案.

其它格式要用man.config中定義的解壓縮工具處理,才可以閱覽.

例如:.gz             /bin/gunzip -c

.bz2            /usr/bin/bzip2 -c -d

.z.z              /bin/zcat

.f.y

這裡說明,.gz格式的用gunzip -c來直接讀取,而.bz2用bzip2 -c -d來讀取,.z用/bin/zcat來讀取

幫助檔案預設的路徑為/usr/share/man和/usr/local/man/

其中/usr/share/man存放了絕大多數的幫助檔案,而且都是壓縮格式的幫助檔案.

/usr/local/man存放的都是以文字格式的幫助檔案.

/usr/share/man中的子目錄是對映的模組.例如man1目錄中存放的幫助檔案是「shell中使用者可用的命令」

而檔名,是命令名/函式名加上模組的序號,如果是壓縮格式,再加入壓縮的副檔名即可.

例如:host.1.gz即是程式名(host).模組的序號(1).副檔名(gz)

第三個問題:

例如,自己寫乙個測試程式hello.c

如下:#include

int main()

;編譯:

gcc -o hello hello.c

在/usr/share/man/建立乙個 man檔案.

檔名要講規範.本例為hello.1

檔案內容如下 :

.\" $id: hello.1,v 1.11.2.2 2009/06/7 04:44:38 marka exp $

.\".th "hello" "1" "jun 7, 2009" "hacker" ""

.sh name

hello \- this is a test.display hello strings.

.sh synopsis

.sp\fbhello\fr

.sh "description"

.pp\fbhello\fr

is a ****** test for show man program.

\fbhello\fr

prints a short test message.

.ppprint follow as:

hello world.this is a test.

.sh "files"

.pp\fbhello\fr

.sh "see also"

.pp\fbprintf\fr(1),

\fbstdio.h\fr(8).

這樣即就可以為hello程式建立man檔案了.當然你沒有hello的可執行程式也是可以執行man hello的.

現在可以用man -aw hello來檢視hello命令的man檔案了.

第四個問題:

whatis的執行流程如下:

1)搜尋/var/cache/man/whatis檔案.

/var/cache/man/whatis是文字檔案.

2)如果/var/cache/man/whatis不存在. 到man.config中manpath指定的路徑到搜尋whatis檔案

說明:1)與man命令搜尋不同之處在於,man命令會首先搜尋path變數指定的路徑.

2)如果找到兩個whatis檔案,將顯示兩遍相同的命令.

例如:whatis ls

ls                   (1)  - list directory contents

ls                   (1)  - list directory contents

3)新建乙個man檔案,例如上面的hello.1,這時用whatis是找不出對映資訊的,因為還沒有同步到/var/cache/man/whatis檔案中.

如果要同步,可以直接用makewhatis -u -w更新whatis檔案.

4)在/etc/cron.daily目錄下有個makewhatis.cron指令碼,它的任務就是每天更新whatis檔案的.

apropos的執行流程與whatis一樣.但apropos是借助whatis檔案進行全文搜尋.

IsPostBack深入分析

1 ispostback 介紹 ispostback是 page類有乙個 bool型別的屬性,用來判斷針對當前 form的請求是第一次還是非第一次請求。當 ispostback true時表示非第一次請求,我們稱為 postback,當 ispostback false時表示第一次請求。在 asp....

深入分析ConcurrentHashMap

再多執行緒的情況下,如果使用hashmap,就會導致死迴圈,導致cpu利用率接近100 所以如果是併發的情況不要使用hashmap 導致死迴圈主要是這段 當在多執行緒的情況由於沒有同步導致,著段 在擴容的時候會執行 do while e null 執行緒安全的hashtable 容器 hashtab...

深入分析malloc

本文大量參考了如何實現乙個malloc這篇文章。任何乙個用過或學過c的人對malloc都不會陌生。大家都知道malloc可以分配一段連續的記憶體空間,並且在不再使用時可以通過free釋放掉。但是,許多程式設計師對malloc背後的事情並不熟悉,許多人甚至把malloc當做作業系統所提供的系統呼叫或c...