幾天看書,看到用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函數符號或全局定義,步驟如下:
- 先把下面的代碼複製粘貼爲文件保存到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
- 進入linux-source,執行如下代碼:
source linux_source_cscope.sh
- 啓動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
隨便找一個打開就可以看到函數定義了,雖然還是調用了系統調用,但總算是可以初窺門道了。