Linux 中如何快速查看 C 庫函數的頭文件以及相應的函數信息?

剛接觸Linux不久,對基本的命令行有一些了解,工作中一直用python寫程序。回到家裡想學習Linux系統編程,但是C語言以及系統的很多庫函數都和windows不一樣,比如strcat_s函數,我包含了string.h編譯它說undefined reference to `strcat_s"。唉,看網上很多也是windows的。我想問一下學系統編程的話有什麼比較好的網站,或是有什麼地方像MSDN那樣查函數很方便的地方?

-------------------------------------------------------------------------------------------------------------------------------

非常感謝各位的回答,目前正在學習《Linux/UNIX系統編程介面》,做裡面的習題的時候遇到了以上問題,看了下man的介紹然後用了一下確實挺不錯的,話說這本書的作者就是man項目的維護者之一。至於使用_s函數的問題,查看了相關函數之後發現帶n的函數也不錯,再就是自己加上一些長度的判斷之類的,畢竟自己搞安全的,不能讓自己的代碼出太多的安全漏洞。之前用C++的string類以及其他語言的字元串處理習慣了,發現C的字元串函數好麻煩,不過熟悉之後應該會好一些。不同系統,不同編譯器對於標準的實現還是很不一樣。


自從看了《UULP》(牆裂推薦這本書),查看頭文件和函數信息簡直so easy !!!

man -k keyword | grep "name" 查找一個man手冊中的簡短說明包含keyword的函數,name為函數名的關鍵字(可以不加管道)

man -k timer | grep "set" 查找一個man手冊中的簡短說明包含timer的函數,set為函數名的關鍵字(可以不加管道),可以查找到以下信息:

getitimer (2) - get or set value of an interval timer

setitimer (2) - get or set value of an interval timer

timer_settime (2) - arm/disarm and fetch state of POSIX per-process timer

timerfd_settime (2) - timers that notify via file descriptors

timerisset (3) - timeval operations

函數調用任君選擇!!!

grep "keyword" /usr/include/*.h | grep "typedef"

grep "keyword" /usr/include/*/*.h | grep "typedef"

如 grep "time_t" /usr/include/*.h | grep "typedef"

可以查找到 " typedef __time_t time_t; "

以上方法可以查找關鍵字為keyword的結構體、類型、函數原型的定義typedef可以替換為define嘗試查找,幾次重複查找找到的定義,就能最終確定。

locate keyword.h
可以查找名為keyword的頭文件所在的目錄樹

如 locate time.h | grep "/usr/include"
可以查找到一下信息:

/usr/include/time.h

/usr/include/utime.h

/usr/include/i386-linux-gnu/bits/time.h

/usr/include/i386-linux-gnu/sys/time.h

/usr/include/linux/time.h

/usr/include/linux/utime.h

/usr/include/linux/netfilter/xt_time.h

/usr/include/python2.7/datetime.h

頭文件任君選擇!!!

從此在linux下編程,函數原型、頭文件、類型定義的查找so easy有木有???

感覺媽媽以後再也不用擔心我的學習了。


函數分三種:

1.ISO C 標準的

2.POSIX 標準的

3.系統自己擴展的(fopen64/kqueue)

第一種可以認為是跨平台的,第二種可以認為是跨 Unix/Linux 的,第三種是系統特定的。

一般來說查閱函數手冊用 man 就好了,想看 POSIX 標準可以去 opengroup 網站。

另外我推薦在 FreeBSD 下學習 Unix 編程,不要用 Linux。

FreeBSD Man Pages: Index Page

The Open Group Base Specifications Issue 7, 2013 Edition


建議用man直接看,可以得到和你的庫版本一致的信息,而且可以得到一些本系統特異的信息。


命令:man 2 &<系統調用&> 、man 3 &<庫函數&>

網站:Linux man pages、cppreference.com

---

題目里的 strcat_s 是 C11 標準的可選部分(類似考試的附加題部分),只有定義了 __STDC_LIB_EXT1__ 宏的編譯器才提供。所以正確的使用方式是:使用前應該先判斷 __STDC_LIB_EXT1__ 是否存在。

VC++ 里沒有定義 __STDC_LIB_EXT1__,所以他們給出的實現還是一貫的不標準。例如:

// MSVC 提供
int vsnprintf_s(char *buffer, size_t sizeOfBuffer,
size_t count,
const char *format, va_list argptr);

// C11 標準
int vsnprintf_s(char *, rsize_t n,
const char *format, va_list arg);

所以題目里的「但是 C 語言以及系統的很多庫函數都和 Windows 不一樣」,實際上是微軟和別人不一樣 ╮(╯_╰)╭


在非微軟的那一邊,strcat_s是C語言最新標準引進的,你喜歡的編譯器還沒支持這是很正常的。我比較喜歡的事cplusplus和cppreference這兩個網站,不過這兩個網站經常出bug,搜索點了都沒反應,然後就當掉了。

你要跟msdn一樣方便我覺得不太現實,你只是想要查的話,可以看上面那兩個,linux自己的、標準以外的函數你可以用man來看。


在終端下直接用man 2 fun 可以查看系統函數,用man 3 fun可以查看c庫函數(fun是你要查的函數名字)

在vim里,你直接把游標移到頭文件,然後gf命令(go to file)可以跳轉到頭文件查看裡邊的東西,在vim裡邊在函數上用shift + k可以跳轉到函數查詢。

另外學linux編程可以參考《unix環境高級編程》


系統函數 man 2 foo

標準庫 man 3 bar


Windows下很多_s的函數Linux下都沒有的。你可以先man下試試,沒有的話試試不帶_s的。strcat之前一直是不帶的,對於新標準,Linux一直是支持比較快的。但是有一些東西究竟需不需要支持,就是另外一回事了。這個說起來又要打嘴仗了


1. 買一本講Linux系統編程的書,系統學習下

2. 有什麼疑惑的,直接用man命令查看

3. 去下載一份POSIX spec看看


Linux man pages

The Linux man-pages project


絕對的手冊啊,man 或者 info 後邊加需要查詢的函數啊,結構體啊的。有時候也網上直接搜索的,畢竟略顯直觀


vim 的 YouCompleteMe,ctages插件可以試試。


推薦閱讀:

為什麼很多人不喜歡豌豆莢?
如何看待微博大V老師木和phunter_lau對某培訓班持不同態度?
有些創始人明明家裡很有錢,為什麼還被逼的去找風險投資?
不斷查看手機、微博、知乎之類的網路依賴和強迫症是怎麼產生的,怎麼解決?
為什麼說帳戶名、密碼是個落後的東西?未來發展方向是什麼?

TAG:互聯網 | Linux | C編程語言 | Linux開發 |