UNIX/Linux 系統實現限制

1. 操作系統實現限制

標準定義了操作系統在實現時的限制

  1. 規定某些最大值最小(至少)是多少,實際實現中可以更大,嚴格符合此標準的應用則應小於這個最小值

  2. 規定某些最小值最大(最多)是多少,實際實現中可以更小,嚴格符合此標準的應用則應大於這個最大值

  3. 即實際的實現範圍應比標準規定的範圍更廣,這樣可以滿足更大的需求

  4. 即嚴格符合標準的應用應在標準規定的範圍內,這樣比較具有可移植性

  5. 標準定義的限制值往往加了 _POSIX_ 或 _XOPEN_ 前綴,系統的具體實現值去掉這些前綴,獲取限制值時函數中限制值名稱參數再加上 _SC_ 或_PC_ 前綴

2. 限制的種類

1. 編譯時限制

在頭文件中定義

例如,短整型的最大值是什麼

2. 運行時限制

要求進程調用相關函數來獲得限制值

例如,文件名最多多少個字符(依賴於運行的文件系統)

1. 操作系統相關的運行時限制

sysconf 函數

2. 文件系統相關的運行時限制

pathconf 函數

fpathconf 函數

例如,文件名有多少個字符

3. ISO C 限制

所有編譯時限制都列在limits.h 中

  1. 整型值的編譯時限制列在 limits.h 中

  2. 浮點數的限制列在 float.h 中

  3. 文件相關的限制

文件相關限制舉例

限制 包含文件 含義
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. 不確定的運行時限制

對於編譯時限制,這些限制值可能沒有在頭文件中定義

對於運行時限制,這些限制值可能是未定義的

例如

路徑名最大長度

最大打開文件數

發佈了52 篇原創文章 · 獲贊 10 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章