1. 程式人生 > >linux-man命令中的編號含義(包括系統調用和庫函數講解)

linux-man命令中的編號含義(包括系統調用和庫函數講解)

linux man

博文說明【前言】:

本文將通過個人口吻介紹linux的man命令中的編號含義(包括系統調用和庫函數解釋),在目前時間點【2017年6月13號】下,所掌握的技術水平有限,可能會存在不少知識理解不夠深入或全面,望大家指出問題共同交流,在後續工作及學習中如發現本文內容與實際情況有所偏差,將會完善該博文內容。


本文參考文獻引用鏈接:

1、http://www.cnblogs.com/chao1118/p/3715523.html
2、http://blog.csdn.net/high_high/article/details/7200053
3、http://www.cnblogs.com/yudao/p/4369982.html
4、http://blog.csdn.net/skyflying2012/article/details/10044343【這篇文章不錯】



正文:


Linux man中的man就是manual的縮寫,用來查看系統中自帶的各種參考手冊,
命令格式:man [n] command
man命令擁有9個選項編號,其對應的關系如下:

1 Executable programs or shell commands
2 System calls (functions provided by the kernel)
3 Library calls (functions wiroutinesthin program libraries)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd

6 Games
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]

英文直譯:

1、可執行程序或者shell命令
2、系統調用(內核可以調用的函數,運行在核心態,內核空間,系統核心可直接呼叫的函數與工具等,通過這個,可以很方便的查到調用某個函數,需要加什麽頭文件,例如open,write函數)
3、庫函數(運行在用戶態,用戶空間,一些常用的函數與函數庫,大部分為c的函數庫,例如print,fread)
4、特殊設備(一般是/dev下的各種設備,例如硬盤設備,光盤等)
5、文件格式(說明這個文件中的各個字段的含義,例如/etc/passwd)
6、遊戲(保留給遊戲使用,由各個遊戲自己定義)
7、雜項,例如Linux文件系統,網絡協議等,變量說明等
8、系統管路員命令(只有管理員才能使用的命令,例如ifconfig,reboot等)
9、跟kernel內核有關的文件

示例:
suse11sp3-1:~ # man passwd
Man: find all matching manual pages
* passwd (1)
passwd (5)
passwd (1ssl)
Man: What manual page do you want?
Man:

在這裏如果我們
輸入1,就是說我們想要查看有關/usr/bin/passwd這個命令有關的信息
輸入5,就是說我們想要查看有關/etc/passwd這個文件有關的信息
輸入1ssl,就是說我們我們想要查看openssl passwd 這個命令有關的信息


什麽是系統調用和庫函數?

一、系統調用

系統調用(system call)是操作系統內核提供的函數,在內核態運行(kernel mode),是操作系統為用戶提供的一些接口,屬於函數中的低等下人,雖然低等,但是誰也離不開他們,因為離開他們就沒辦法和內核打交道了,沒辦法和內核打交道就什麽都歇菜了。
例如標準C庫函數printf()可以被看做是一個通用的輸出語句,但它實際做的是將數據轉化為符合格式的字符串並且調用系統調用write()輸出這些字符串。我要printf("hello,world!"),實際上是調用的write()來實現的,而這個write()就是系統提供的接口函數

那麽系統調用的意義是什麽?

1、系統調用把我們從底層的硬件編程中解放了出來。

你想想看,你寫一個程序還需要自己去實現在屏幕上打印字符串的代碼,這也太累人了吧。


2、提高系統安全性

系統調用是內核代碼,內核代碼能訪問系統上的所有地址空間,而我們執行的代碼是用戶空間的代碼,用戶空間的代碼在對系統進行操作時是有限制的,(作為一個菜鳥程序員,系統如果不對你寫的代碼進行限制,萬一把系統搞蹦了呢)。因此系統調用的另一個功能就是維護了系統的安全性,你要用就直接調用我這個接口就行了,不用你自己寫。


3、系統調用還有一個功能就是為了方便程序的移植性。。

總之,你就把系統調用當做一個系統底層接口,什麽時候你需要使用它了,調用一下它就行了,既方便又安全。


二、庫函數


庫函數是高層的,是在系統調用上的一層包裝,運行在用戶態(user mode),為程序員提供調用真正的在幕後完成實際事務的系統調用的更為方便的接口。其實你可以把庫函數當做是對系統調用的又一次封裝。打個比方吧,庫函數相當於包工頭,系統調用是工人,我們可以自己找工人分任務,但一般是把任務攤給包工頭,包工頭再去給工人分任務。

那麽庫函數的意義是什麽?


1、提高程序的執行效率。

系統調用作為內核提供給我們的接口,它的執行效率是比較高效精簡的。但是有時候我們需要對獲取的信息進行更復雜的處理,這個時候如果我們把這些處理過程包裝成一個函數再提供給程序員,不是更方便編程了嗎?因此一個庫函數有可能含有一個系統調用,有可能有好幾個系統調用,當然也有可能沒有系統調用,比如有些操作就不需要涉及內核的功能。

2、提高程序的可移植性

從程序的可移植性的角度來看,相對於系統調用,C語言的標準備函數庫(ANSI C)具備較高的可移植性,在不同的系統環境下,只要做很少的修改,通常情況是不需要修改的。

所以雖然最終所有的工作都是系統調用做的,但是我們更通常的做法是調用庫函數,有以下幾個原因:

1、庫函數提供了抽象,抽象是個好東西,可以讓我們把更多的註意力集中在要解決問題的核心。
2、庫函數給我們提供的接口更人性化,所以調用起來更方便。
3、調用庫函數更安全,內存管理不用自己太操心。
4、調用庫函數效率更高,程序跑的更快。雖然庫函數最終是調用系統函數,但是庫函數會比我們用更好的方式方法調用系統函數。因為系統調用是內核態的函數,每次調用內核都要從用戶態切到內核態,更主要的是庫函數內部的緩存,可以減少系統調用的次數,同樣100次輸出,寫成系統調用就是赤裸裸的100次系統調用,相當慢;而寫成庫函數就可能被內部緩存保存起來調用一次系統調用輸出,一次哦,效率當然也就快了。但是一些特殊情況下只能使用系統調用,比如編寫驅動程序,使用特殊的輸入輸出控制等等。

補充:
庫函數不光可以在系統調用的基礎上包裝,也可以在其他庫函數的基礎上包裝,提供更高級的抽象,更強大的功能。比如OGRE對OpenGL的包裝,Qt對Xlib的包裝,類似於從老總到秘書到部門主管到包工頭再到工人的過程,當然我我們就是老總了,只要我們高興,不光調用秘書(好邪惡啊。。。),直接調用主管,包工頭,甚至自己當工人都可以,自己寫個系統調用,然後重新編譯內核,然後再調用自己寫的系統調用,可以參考下方鏈接。

自行編寫系統調用:跳轉鏈接:http://tldp.org/HOWTO/html_single/Implement-Sys-Call-Linux-2.6-i386/#AEN27


總結:

系統調用是為了方便應用程序使用操作系統的接口,而庫函數是為了方便人們編寫應用程序而引出的


最後介紹兩個工具,strace和ltrace。
strace查看我們的可執行文件調用了哪些系統調用
ltrace查看可執行文件調用了哪些庫函數,喜歡逆向工程的朋友一定很喜歡。
用法很簡單,直接在命令後面跟可執行文件路徑就好了。




結尾:



感謝閱讀,祝有收獲的一天,謝謝!






本文出自 “清風攬月的博客” 博客,請務必保留此出處http://watchmen.blog.51cto.com/6091957/1935103

linux-man命令中的編號含義(包括系統調用和庫函數講解)