瞭解系統的線程資源限制是使得應用程式恰當地管理它們的關鍵。前面已經討論了利用系統資源的樣本。當設定線程的棧大小時,最小值為PTHREAD_MIN_STACK。棧大小不應當低於由pthread_attr_getstacksize( )返回的預設棧大小的最小值。每個進程的最大線程數決定了能夠為每個進程建立的worker線程的上限。函數sysconf( )用於返回可配置系統限制或選項的當前值。系統中定義了同線程、進程和訊號量相關的多個變數和常量。列出了部分變數和常量。
變 量 |
名字值(Name Value) |
描 述 |
_SC_THREADS |
_POSIX_THREADS |
支援線程 |
_SC_THREAD_ATTR_STACKADDR |
_POSIX_THREAD_ATTR_STACKADDR |
支援線程棧地址屬性 |
_SC_THREAD_ATTR_STACKSIZE |
_POSIX_THREAD_ATTR_STACKSIZE |
支援線程棧大小屬性 |
_SC_THREAD_STACK_MIN |
PTHREAD_STACK_MIN |
線程棧儲存區的最小大小,以位元組為單位 |
_SC_THREAD_THREADS_MAX |
PTHREAD_THREADS_MAX |
每個進程的最大線程數 |
_SC_THREAD_KEYS_MAX |
PTHREAD_KEYS_MAX |
每個進程關鍵字的最大數目 |
_SC_THREAD_PRIO_INHERIT |
_POSIX_THREAD_PRIO_INHERIT |
支援優先順序繼承選項 |
_SC_THREAD_PRIO |
_POSIX_THREAD_PRIO_ |
支援線程優先順序選項 |
_SC_THREAD_PRIORITY_SCHEDULING |
_POSIX_THREAD_PRIORITY_SCHEDULING |
支援線程優先順序調度選項 |
_SC_THREAD_PROCESS_SHARED |
_POSIX_THREAD_PROCESS_SHARED |
支援進程共用同步 |
_SC_THREAD_SAFE_FUNCTIONS |
_POSIX_THREAD_SAFE_FUNCTIONS |
支援安全執行緒函數 |
_SC_THREAD_DESTRUCTOR_ITERATIONS |
_PTHREAD_THREAD_DESTRUCTOR_ITERATIONS |
決定線上程退出時嘗試銷毀線程特定資料的嘗試次數 |
_SC_CHILD_MAX |
CHILD_MAX |
每個UID允許的最大進程數目 |
_SC_PRIORITY_SCHEDULING |
_POSIX_PRIORITY_SCHEDULING |
支援進程調度 |
_SC_REALTIME_SIGNALS |
_POSIX_REALTIME_SIGNALS |
支援即時訊號 |
_SC_XOPEN_REALTIME_THREADS |
_XOPEN_REALTIME_THREADS |
支援X/Open POSIX即時線程特性組 |
_SC_STREAM_MAX |
STREAM_MAX |
決定進程能夠開啟的流的數目 |
_SC_SEMAPHORES |
_POSIX_SEMAPHORES |
支援訊號量 |
_SC_SEM_NSEMS_MAX |
SEM_NSEMS_MAX |
決定線程能夠擁有的訊號量的最大數目 |
_SC_SEM_VALUE_MAX |
SEM_VALUE_MAX |
決定訊號量的最大值 |
_SC_SHARED_MEMORY_OBJECTS |
_POSIX_SHARED_MEMORY_OBJECTS |
支援共用記憶體對象 |
下面是調用sysconf( )的樣本:
if(PTHREAD_STACK_MIN== (sysconf(_SC_THREAD_STACK_MIN)))
Unix系統實現定義了很多幻數和常量,這些在不同程度上依從POSIX,也遵從POSIX.1標準。這就有助於軟體的可移植性。
以下兩種類型的限制是必須的:
1) 編譯時間限制(例如,短整型的最大值是什嗎?)
2) 運行時限制(例如,檔案名稱可以有多少個字元?)
編譯時間限制可在標頭檔中定義,程式在編譯時間可以包含標頭檔。但是,運行時限制則要求進程調用一個函數以擷取此種限制值。
為瞭解決此類問題:
1) 編譯時間限制(例如,短整型的最大值是什嗎?)
2) 不與檔案或目錄相關聯的運行時限制(sysconf函數)
3) 與檔案或目錄相關聯的運行時限制(pathconf和fpathconf函數)
2. 函數原型
#include
long sysconf(int name);
long pathconf(const char *pathname, int name);
long fpathname(int filedes, int name);
所有函數傳回值:若成功則返回相應值;若出錯則返回-1.
傳回值:
(1)如果name 不是一個合適的常量,則所有三個函數都會返回-1,並將 errno 設定為EINVAL。
(2)有些name可以返回變數的值(傳回值>=0),或者返回-1,這表示該值是不確定的,此時不改變 errno的值。
因此,程式要檢查錯誤,應該在調用 sysconf() 之前將 errno 設定為 0 ,然後如果返回-1,則檢驗到錯誤。
表1 sysconf的限制及name參數,用於標識系統限制。以__SC__開始的常量用作標識運行時限制的sysconf參數。
Name of limit |
Description |
name argument |
ARG_MAX |
maximum length, in bytes, of arguments to the exec functions |
_SC_ARG_MAX |
ATEXIT_MAX |
maximum number of functions that can be registered with the atexit function |
_SC_ATEXIT_MAX |
CHILD_MAX |
maximum number of processes per real user ID |
_SC_CHILD_MAX |
clock ticks/second |
number of clock ticks per second |
_SC_CLK_TCK |
COLL_WEIGHTS_MAX |
maximum number of weights that can be assigned to an entry of the LC_COLLATE order keyword in the locale definition file |
_SC_COLL_WEIGHTS_MAX |
HOST_NAME_MAX |
maximum length of a host name as returned by gethostname |
_SC_HOST_NAME_MAX |
IOV_MAX |
maximum number of iovec structures that can be used with readv or writev |
_SC_IOV_MAX |
LINE_MAX |
maximum length of a utility's input line |
_SC_LINE_MAX |
LOGIN_NAME_MAX |
maximum length of a login name |
_SC_LOGIN_NAME_MAX |
NGROUPS_MAX |
maximum number of simultaneous supplementary process group IDs per process |
_SC_NGROUPS_MAX |
OPEN_MAX |
maximum number of open files per process |
_SC_OPEN_MAX |
PAGESIZE |
system memory page size, in bytes |
_SC_PAGESIZE |
PAGE_SIZE |
system memory page size, in bytes |
_SC_PAGE_SIZE |
RE_DUP_MAX |
number of repeated occurrences of a basic regular expression permitted by the regexec and regcomp functions when using the interval notation /{m,n/} |
_SC_RE_DUP_MAX |
STREAM_MAX |
maximum number of standard I/O streams per process at any given time; if defined, it must have the same value as FOPEN_MAX |
_SC_STREAM_MAX |
SYMLOOP_MAX |
number of symbolic links that can be traversed during pathname resolution |
_SC_SYMLOOP_MAX |
TTY_NAME_MAX |
length of a terminal device name, including the terminating null |
_SC_TTY_NAME_MAX |
TZNAME_MAX |
maximum number of bytes for the name of a time zone |
_SC_TZNAME_MAX |
表2 sysconf的限制及name參數,用於標識系統限制。以__PC__開始的常量用作標識運行時限制的pathconf參數和fpathconf參數。
Name of limit |
Description |
name argument |
FILESIZEBITS |
minimum number of bits needed to represent, as a signed integer value, the maximum size of a regular file allowed in the specified directory |
_PC_FILESIZEBITS |
LINK_MAX |
maximum value of a file's link count |
_PC_LINK_MAX |
MAX_CANON |
maximum number of bytes on a terminal's canonical input queue |
_PC_MAX_CANON |
MAX_INPUT |
number of bytes for which space is available on terminal's input queue |
_PC_MAX_INPUT |
NAME_MAX |
maximum number of bytes in a filename (does not include a null at end) |
_PC_NAME_MAX |
PATH_MAX |
maximum number of bytes in a relative pathname, including the terminating null |
_PC_PATH_MAX |
PIPE_BUF |
maximum number of bytes that can be written atomically to a pipe |
_PC_PIPE_BUF |
SYMLINK_MAX |
number of bytes in a symbolic link |
_PC_SYMLINK_MAX |