ubuntu中安裝man手冊查看函數原型

幾天看書,看到用man命令可以查看c語言庫函數的函數原型,就今天試了試。可是不行。提示沒有我要查找的那個條目。上網搜解決方案。原來ubuntu中man的手冊默認沒有裝。用下面幾條命令就行了:

sudo apt-get install manpages 
sudo apt-get install manpages-de 
sudo apt-get install manpages-de-dev 
sudo apt-get install manpages-dev

另附上一篇從他人處copy來的文章:

ubuntu man手冊完善

Linux提供了豐富的幫助手冊,當你需要查看某個命令的參數時不必到處上網查找,只要man一下即可。
Linux 的man手冊共有以下幾個章節:

1、Standard commands (標準命令)
2、System calls (系統調用)
3、Library functions (庫函數)
4、Special devices (設備說明)
5、File formats (文件格式)
6、Games and toys (遊戲和娛樂)
7、Miscellaneous (雜項)
8、Administrative Commands (管理員命令)


例如:我們輸入 man ls,它會在最左上角顯示“LS(1)”,在這裏,“LS”表示手冊名稱,而“(1)”表示該手冊位於第一節章,同樣,我們輸入“man ifconfig”它會在最左上角顯示“IFCONFIG(8)”。也可以這樣輸入命令:“man [章節號] 手冊名稱”。

man是按照手冊的章節號的順序進行搜索的,比如:

man sleep

只會顯示sleep命令的手冊,如果想查看庫函數sleep,就要輸入:

man 3 sleep

ubuntu默認是沒有安裝c語言的庫函數man手冊的

1.添加庫函數手冊 
ubuntu默認是沒有安裝c語言的庫函數man手冊的,所以你在man perror 和sendto之類的函數時會顯示沒有相關文檔的問題,這個問題讓我鬱悶了我好久。解決方法:
sudo apt-get install manpages-dev 
2.讓man顯示中文 
ubuntu源裏面已經包含了中文的man包,所以不用從其他地方down了,直接
sudo apt-get install manpages-zh 
但是這樣man默認顯示的還不是中文,還需要以下兩步
a.把中文man包轉換成utf8格式的 
新建一個腳本文件
gedit t.sh
把下面內容添加進去
#!/bin/bashcd /usr/share/man/zh_CN/for k in *docd $kfor i in *.gzdo j=`echo ${i%.gz}` gunzip $i iconv -f gb18030 -t utf8 $j >tmp mv tmp $j gzip $jdonecd ..done
然後
sudo ./t
b.修改man默認的語言 
sudo gedit /etc/manpath.config 把裏面的所有的 /usr/share/man 改成 /usr/share/man/zh_CN
保存後退出,然後你再試一下man ls
3.讓沒有中文幫助的顯示英文 
做完上面第二部還不夠,這時你再man 一下一些c語言函數(不要用printf,socket之類比較有名的函數,這些已經有中文幫助了)的時候就會發現竟然沒有幫助,而剛纔明明在第一步已經安裝了啊。這是因爲你上面 把/usr/share/man 改成 /usr/share/man/zh_CN的操作使man只在中文幫助中搜索,如果沒有就直接放棄,因此還需要以下操作,才能讓man在沒有中文幫助的時候自動顯示英文的幫助,如果英文的也沒有,哪就真的沒有了。
sudo gedit /etc/manpath.config
然後搜索你剛纔改過的地方,然後在其後面添加同樣的一行,只是後面的目錄還用原來的/usr/share/man,比如在修改後的
MANPATH_MAP /bin          /usr/share/man/zh_CN
再添加一行
MANPATH_MAP /bin          /usr/share/man

【下面是另一種方法】

今天想看一下系統函數如usleep的函數體,卻發現怎麼也找不到,先用man查看該函數的原型和所在頭文件,使用如下代碼: man 3 usleep 得知該函數定義在unistd.h文件中,用locate命令找到這個文件的位置,打開發現只有一個包含asm/unistd.h的語句,接着打開asm/unistd.h又發現根據系統類型選擇包含asm/unistd_32.h或asm/unistd_64.h,再打開unistd_32.h,搜索usleep卻什麼都找不到,別說函數體了,連函數聲明都沒有,有點兒小鬱悶。 第一個方法行不通,就換第二個方法:去linux內核源碼中搜索,先下載linux內核源碼,用如下命令: apt-get install linux-source-2.6.24 下載完後是個tar.bz2壓縮文件,在/usr/src目錄中,解壓到當前目錄就行,解壓後建立一個符號鏈接linux-source指向linux-source-2.6.24,然後用cscope搜索usleep函數符號或全局定義,步驟如下:

  1. 先把下面的代碼複製粘貼爲文件保存到linux-source文件夾中,文件名隨意,假設爲:linux_source_cscope.sh
    #導出CSCOPE_DB變量
    if [ ! -e /usr/src/linux-source/cscope.out ]
    then
        cd /
        find /usr/src/linux-source-2.6.24/ -name '*.c' -o -name '*.h' > /usr/src/linux-source/cscope.files
        cd /usr/src/linux-source/
        cscope -b
    fi
    CSCOPE_DB=/usr/src/linux-source/cscope.out
    export CSCOPE_DB
  2. 進入linux-source,執行如下代碼: source linux_source_cscope.sh
  3. 啓動cscope(如果沒裝的需要安裝),先查找全局定義,沒有找到,再查找符號,得到如下結果: C symbol: usleep File Function Line 0 macfb.c civic_setpalette 447 usleep(10); 1 unistd.h ualarm 420 extern int usleep (__useconds_t __useconds); 第一個明顯不是,進入第二個發現只是一個函數聲明,沒有函數體。

第二種方法也找不到庫函數的函數體,心情無比鬱悶,就去論壇上發了個帖子,沒有結果,不過HuntXu倒是給了點兒提示:因爲編譯成庫了...你只是調用庫而已...。晚上在網上搜的時候有人說在libc裏庫函數就定義在它的同名文件中,比如usleep就定義在usleep.c中,受此啓發,就搜索usleep.c文件,結果是我的系統裏沒有,Linux源碼裏也沒有,我裝的nios2-linux開發包裏的uClibc目錄裏倒是有,呵呵,現在問題明朗化了,去下載glibc的源碼,用如下命令: apt-get install glibc-source 下載完後在/usr/src/glibc/目錄中,也是壓縮文件,有好幾個,我只解壓了最基本的glibc-2.7.tar.bz2,解壓後運行sudo updatedb更新數據庫,再搜索就發現usleep.c文件了,結果如下: /usr/src/glibc-2.7/misc/usleep.c /usr/src/glibc-2.7/sysdeps/mach/usleep.c /usr/src/glibc-2.7/sysdeps/unix/bsd/usleep.c /usr/src/glibc-2.7/sysdeps/unix/sysv/linux/usleep.c 隨便找一個打開就可以看到函數定義了,雖然還是調用了系統調用,但總算是可以初窺門道了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章