2010-06-01 98 views
7

在/ usr/include目錄在Linux中我輸入的命令目錄: 找到型的F -name unistd.h中這給了以下的輸出:Linux中/ usr/include下各種unistd.h之間的區別是什麼?

./unistd.h ./linux/unistd.h ./asm-generic/unistd.h ./bits/unistd.h ./asm/unistd.h ./sys/unistd.h

我的問題是,什麼是每個unistd.h中的目的,因爲單個unix規範中只有該文件的一個定義?

在此先感謝。

回答

7

linux/unistd.h實際上指向asm/unistd.h,這反過來點要麼asm/unistd_32.hasm/unistd_64.h,這是在系統調用號碼被定義,並根據該系統的體系結構呈現給用戶空間。這些來自內核。

bits/unistd.h是增加unistd.h(大部分的東西,以幫助防止緩衝區溢出)宏的集合,它通過有條件地包括:

/* Define some macros helping to catch buffer overflows. */ 
#if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline 
# include <bits/unistd.h> 
#endif 

在本質上,只需要POSIX標題是其實只是unistd.h ,其餘的是擴展或內核定義。所以,只需包括unistd.h就可以完成所有操作,根據您的架構和您選擇的任何構建選項,您需要的所有內容都將被拉入。

3

這是C和C++中常見的技術 - 在「標準」位置有一個帶有「標準」名稱的單個文件,在這種情況下爲./unistd.h,然後讓該文件包含一個或多個實現具體的文件,取決於預處理器的宏。如果你看幾乎所有的「標準」C或C++頭文件,你會看到它包括任何標準中沒有提到的其他文件。

0

基本上把/usr/include/unistd.h想象成一個智能的符號鏈接。它將根據您的操作條件指向正確的實施。

這就是說,有時很難弄清楚什麼是正確的實現。

相關問題