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...