1. 操作系統實現限制
標準定義了操作系統在實現時的限制
規定某些最大值最小(至少)是多少,實際實現中可以更大,嚴格符合此標準的應用則應小於這個最小值
規定某些最小值最大(最多)是多少,實際實現中可以更小,嚴格符合此標準的應用則應大於這個最大值
即實際的實現範圍應比標準規定的範圍更廣,這樣可以滿足更大的需求
即嚴格符合標準的應用應在標準規定的範圍內,這樣比較具有可移植性
標準定義的限制值往往加了 _POSIX_ 或 _XOPEN_ 前綴,系統的具體實現值去掉這些前綴,獲取限制值時函數中限制值名稱參數再加上 _SC_ 或_PC_ 前綴
2. 限制的種類
1. 編譯時限制
在頭文件中定義
例如,短整型的最大值是什麼
2. 運行時限制
要求進程調用相關函數來獲得限制值
例如,文件名最多多少個字符(依賴於運行的文件系統)
1. 操作系統相關的運行時限制
sysconf 函數
2. 文件系統相關的運行時限制
pathconf 函數
fpathconf 函數
例如,文件名有多少個字符
3. ISO C 限制
所有編譯時限制都列在limits.h 中
整型值的編譯時限制列在 limits.h 中
浮點數的限制列在 float.h 中
文件相關的限制
文件相關限制舉例
限制 | 包含文件 | 含義 |
---|---|---|
FOPEN_MAX | stdio.h | 可以同時打開的標準 I/O 流的最小個數 |
TMP_MAX | stdio.h | 由 tmpnam 函數產生的唯一文件名的最大個數 |
FILENAME_MAX |
4. POSIX 限制
文件相關限制舉例
限制 | 包含文件 | 含義 |
---|---|---|
STREAM_MAX | 同 FOPEN_MAX | |
NAME_MAX | 替代 FILENAME_MAX | |
PATH_MAX | 替代 FILENAME_MAX |
1. 編譯時限制分類(常量)
1. 數值限制
LONG_BIT, SSIZE_MAX 和 WORD_BIT
2. 最小值
在 limits.h 中定義了25個可接受最小值的常量
_POSIX_OPEN_MAX
_POSIX_PATH_MAX
實現值爲去掉_POSIX_前綴
3. 最大值
_POSIX_CLOCKERS_MIN
2. 運行時限制分類(函數調用)
1. 運行時可增加值
CHARCLASS_NAME_MAX
COLL_WEIGHTS_MAX
LINE_MAX
NGROUPS_MAX
RE_DUP_MAX
2. 運行時不變值(可能不確定)
可能定義在給定系統的頭文件中,也可能需要調用函數
ARG_MAX
ATEXIT_MAX
在 limits.h 中定義了17個常量
3. 其他不變值
NL_ARGMAX
NL_MSGMAX
NL_SETMAX
NL_TEXTMAX
4. 路徑名可變值
即在不同的路徑下,限制值是不同的
FILESIZEBITS
LINK_MAX
MAX_CANON
MAX_INPUT
NAME_MAX
PATH_MAX
PIPE_BUF
SYMLINK_MAX
5. XSI 限制
1. 最小值
NL_LANGMAX
NZERO
_XOPEN_IOV_MAX
_XOPEN_NAME_MAX
_XOPEN_PATH_MAX
在 limits.h 中定義
2. 運行時不變值
IOV_MAX
PAGE_SIZE5
6. 獲取運行時限制的實現值
1. 操作系統相關的運行時限制
#include <unistd.h>
long sysconf(int name);
name 參數以 _SC_
開頭
2. 文件系統相關的運行時限制
#include <unistd.h>
long pathconf(const char *pathname, int name);
long fpathconf(int fd, int name);
name 參數以 _PC_
開頭
3. 限制文件
pathconf.sym
sysconfig.sym
這兩個文件包含了用製表符分隔的限制名和符號列表(即實現值,用幻數表示)
7. 不確定的運行時限制
對於編譯時限制,這些限制值可能沒有在頭文件中定義
對於運行時限制,這些限制值可能是未定義的
例如
路徑名最大長度
最大打開文件數