APUE讀書筆記 第二章 unix標準及實現

2021-07-13 11:31:10 字數 2475 閱讀 4945

《程式設計師的自我修養》這本書的讀書筆記就先告一段落了,最後一章的執行時庫實現也沒有實現,有機會再補上吧。今天又回到apue,第一章也不給大家分享什麼了,這本書的讀書筆記從第二章開始。好了開始今天的主題,第二章2.4小節之前關於unix標準與實現的討論在此也就不詳細分析了,從2.5小節開始。

2.5小節主要討論unix系統中的「限制」,主要包括兩類限制:

編譯時限制,例如,短整型的最大值是多少。編譯時限制可在標頭檔案中定義,程式在編譯時可包含這些標頭檔案。

執行時限制,例如,檔名有多少個字元。執行時限制要求程序呼叫乙個函式獲得限制值。

但以上這些限制都不是絕對,某些限制在乙個給定的實現中可能是固定的(可採用靜態地在乙個標頭檔案中定義),而在另乙個實現中可能是變動的(需要有乙個執行時函式呼叫)。為了解決這類問題(我認為主要就是提高程式的可移植性),作業系統提供了以下三種限制:

編譯時限制(標頭檔案)。

與檔案或目錄無關的執行時限制(sysconf函式)。

與檔案或目錄有關的執行時限制(pathconf和fpathconf函式)。

2.5.1節主要分析iso c的限制,iso c定義的所有編譯時限制都列在(在/usr/include/資料夾下)。有關於浮點型別資料的限制都定義在中。還有一部分常量定義在中。

2.5.2節主要分析posix的限制,共包括7類限制與常量,在此就不給大家展開討論了,以後用到了再說。這裡要談一點的就是,posix標準中定義的最小可接受值過小,一般實現中的最小值都要大於這一數值,因此在編譯時不能使用posix標準中定義的常量,而應使用系統中具體的實現值。其中某些值由posix.1定義為「可能不確定的」(邏輯上是無限的),這意味著該值沒有實際上限。

2.5.4節給出了三個函式,這三個函式可用於確定乙個特定系統實際支援的限制值(不確定的值也可以通過上述函式獲得,但不確定的值通過返回-1來體現)。三個函式的原型定義如下:

#includelong sysconf(int name); 

long pathconf(const char *pathname, int name);

long fpathname(int fd, int name);

後兩個函式的區別在於:第二個是使用路徑名作為其引數,而第三個是使用檔案描述符作為引數。

sysconf函式所使用的name引數,用於標識系統限制。以_sc_開頭的常量用於標識執行時限制的sysconf引數。在我的機器上中包含有「#include 」,這個檔案位於/usr/include/x86_64-linux-gnu/bits/資料夾下,在該檔案中就定義有相關的常量,這些常量被組織稱為enum變數,所以此處也可以看到sysconf的值實際上就是乙個從0開始的int值。pathconf與fpathname的name引數情況類似。

這裡要著重談一下這三個函式的返回值:

如果name引數不正確,那麼這三個函式都返回-1,並將errno設為einval。如果某個name返回的值不確定,那麼同樣返回-1,但此時不改變errno的值,所以對於這三個函式的利用,首先需要設定errno為0,在返回-1的情況下,同時需要檢查errno的值,若此時errno仍然為0,那麼說明這個值在作業系統中沒有定義。

若返回值》=0,那麼說明程式正常返回。

以下內容直接引用自apue:

對於pathconf的引數pathname以及fpathconf的引數filedes有一些限制。如果不滿足其中任何乙個限制,則結果是未定義的:

_pc_max_canon和_pc_max_input所**呢的檔案必須是終端檔案;

_pc_link_max所引用的檔案可以使檔案或目錄。如果是目錄,則返回值用於目錄本身(而不是用於目錄內的檔名項);

_pc_filesizebits和_pc_name_max所引用的檔案必須是目錄,返回值用於該目錄中的檔名;

_pc_path_max引用的檔案必須是目錄。當所指定的目錄是工作目錄時,返回值是相對路徑名的最大長度;

_pc_pipe_buf所引用的檔案必須是管道、fifo或目錄。在管道或者fifo情況下,返回值是對所引用的管道或fifo的限制值。對於目錄,返回值是對在該目錄中建立的任一fifo的限制值;

_pc_symlink_max所引用的檔案必須是目錄。返回值是該目錄中符號鏈結可能包含的字串的最大長度。

除了以上限制外,unix還定義有一些選項,這些所謂的選項的作用就是用於判斷當前使用的系統是否具備某些限制,例如_pc_chown_restricted選項用於判斷「使用chown是否是受限的」,選項的結果就是0或1。對於這些選項所採用的處理方法與限制相同,都是通過編譯時定義(),或者使用sysconf、pathconf、fpathname函式。對於這些選項存在3種可能的平台支援狀態:

如果符號常量沒有定義或定義值為-1,那麼該平台在編譯是不支援相應選項(聽起來像廢話)。

如果符號常量的定義值大於0,那麼該平台支援相應選項。

如果符號常量的定義值為0,則必須呼叫sysconf、pathconf、fpathname函式來判斷相應選項是否受到支援。

若系統定義某個符號常量的值為-1或0,同時上述三個函式的返回值為-1,那麼表示相應的選項未被支援。

第二章 讀書筆記

第二章主要講的內容是搭建android 底層開發環境 其中包括 android 應用程式開發環境 android ndk 開發環境和交叉編譯環境的搭建。由於 android 基於linux 核心,所以搭建環境需要使用 linux 作為開發 linux 驅動的平台。它的底層開發需要的工具包含眾多的程式...

第二章讀書筆記

本章主要介紹搭建android 底層開發環境,主要包括 android 應用程式開發環境 android ndk 開發環境和交叉編譯環境的搭建。首先安裝jdk 並配置環境變數 搭建android 應用程式開發環境 1,安裝 android sdk 解壓後進入android sdk linux 目錄,...

Effective C 第二章 讀書筆記

05.了解c 預設編寫並呼叫哪些函式 編譯器缺省會產生四個函式 預設建構函式,預設析構函式,預設拷貝建構函式,預設複製操作符 即 06.若不想使用編譯器自動生成的函式,就該明確拒絕 為駁回編譯器自動提供的機能,可將相應的函式宣告為 private 並不予實現。使用像 uncopyable 這樣的 b...