對於在不同 Unix 系統之間移植程式,最重要的事情就是確定新系統的一些編譯時、運行時固定或不固定的限制值了。例如文件路徑最大長度 PATH_MAX、進程最大可打開文件句柄數 OPEN_MAX、用戶可加入的附加用戶組最大數量 NGROUPS_MAX、進程命令行參數最大位元組數 ARG_MAX、記憶體頁大 ...
對於在不同 Unix 系統之間移植程式,最重要的事情就是確定新系統的一些編譯時、運行時固定或不固定的限制值了。例如文件路徑最大長度 PATH_MAX、進程最大可打開文件句柄數 OPEN_MAX、用戶可加入的附加用戶組最大數量 NGROUPS_MAX、進程命令行參數最大位元組數 ARG_MAX、記憶體頁大小 PAGESIZE、線程棧大小預設值 STACKSIZE、臨時文件最大數量 TMP_MAX 等等。甚至有些系統特征也可以通過查詢來提前確定,例如是否支持讀寫鎖、是否支持非同步 IO、是否支持實時信號等等,這樣程式就可以根據系統提供的能力來選擇不同的介面去實現同樣的功能。
回頭來看 apue 第二章有關係統限制與選項這一塊的內容,由於摻雜了 UNIX 標準化的內容,顯得很沒有條理,例如將各種限制按標準劃分為:
- ISO C
- 編譯時限制 (頭文件常量)
- POSIX
- 不變的最小值 (聲明遵循 POSIX 的系統必需支持到至少這麼多,不能再小了)
- 不變值 (SSIZE_MAX)
- 運行時可增加的值
- 運行時不變的值
- 路徑名可變值
- XSI
- 不變的最小值 (同上)
- 數值限制
- 運行時不變值
看得人一頭霧水,其實如果拋開標準,單按限制的性質來分,就比較簡單啦:
- 編譯時限制 (通過頭文件常量)
- 運行時限制
- 不與文件系統相關部分(通過 sysconf)
- 與文件系統相關部分(通過 pathconf)
也就是說,要確定一個系統限制,一共分兩步:
- 確定相應的符號常量有沒有在頭文件定義,如果有,直接拿來用;
- 如果沒有,走 sysconf 或 pathconf 查詢。
對於系統選項,稍等複雜一點,分三步:
- 符號常量定義為 -1,平臺不支持該選項;
- 符號常量定義大於 0,平臺支持相應的選項;
- 符號常量定義為 0,需要進一步依靠 sysconf 或 pathconf 來查詢。
到這裡,你大概已經想到怎麼自己製作一個工具了,那就是按上面的邏輯 coding 唄,可以把想要查的常量作為輸入,查到的結果列印到控制台,為方便工具靈活的處理各種不同輸入,常量可以作為命令行參數輸入,就像下麵這樣:
未完待續……