眾所周知,sysconf 用來返回某種常量的定義或者資源的上限,前者用於應用動態的判斷系統是否支持某種標準或能力、後者用於決定資源分配的尺寸。 但是你可能不知道的是,sysconf 可以返回四種狀態: 常量定義本身或資源上限 (>=0, 整型值) 無限制 (no limit) 不支持 出錯 那一個小 ...
眾所周知,sysconf 用來返回某種常量的定義或者資源的上限,前者用於應用動態的判斷系統是否支持某種標準或能力、後者用於決定資源分配的尺寸。
但是你可能不知道的是,sysconf 可以返回四種狀態:
- 常量定義本身或資源上限 (>=0, 整型值)
- 無限制 (no limit)
- 不支持
- 出錯
那一個小小的 int 返回類型,如何能容納這許多含義? 各位看過下麵這段代碼,就一目瞭然了:
static void
pr_sysconf (char *msg, int name)
{
long val;
fputs (msg, stdout);
errno = 0;
if ((val = sysconf (name)) < 0) {
if (errno != 0) {
if (errno == EINVAL)
fputs ("(not supported)\n", stdout);
else
err_sys ("sysconf error");
}
else
fputs ("(no limit)\n", stdout);
}
else
printf ("%ld\n", val);
}
這段代碼用來列印 sysconf 的返回值,可以看到基本是通過 '返回值 + errno' 的方式實現的:
- 返回值 >= 0: 常量定義或資源本身
- 返回值 < 0:
- errno == 0: 無限制
- errno != 0:
- errno == EINVAL: 不支持
- 其它:出錯
其實看下 sysconf 的手冊頁的話,確實是這麼說的:
RETURN VALUE
If name is invalid, -1 is returned, and errno is set to EINVAL. Otherwise, the value returned is the value of the system resource
and errno is not changed. In the case of options, a positive value is returned if a queried option is available, and -1 if it is
not. In the case of limits, -1 means that there is no definite limit.