概念
运行时恒定值
运行时恒定值是指某一限制,若已经在<limits.h>
中定义,则对于实现而言固定。但是该值是不确定的(因为该值可能依赖于可用的内存空间),因而在<limits.h>
中会忽略其定义。
这种情况可以使用sysconf()
在运行时获取。
运行时可增加值
运行时可增加值是指某一限制,相对于特定实现其值固定,且运行此实现的所有系统至少都应支持这一最小值,然而,特定系统在运行时可能会增加这一最小值,可以使用sysconf()
来获取系统所支持的实际值。
路径名变量值
路径名变量是指与路径名(文件、目录、终端等)相关的限制,每个限制可能是相对于某个系统实现的常量,也可能随文件系统的不同而不同。在限制可能因路径名而发生变化的情况下,应用程序可以使用pathconf()
、fpathconf()
来获取该值。
在shell中获取限制和选项:getconf
在shell中,可以使用getconf
命令获取特定UNIX系统中已然实现的限制和选项。
格式一般如下:
$getconf ARG_MAX
2097152
$getconf NAME_MAX /boot
255
运行时获取系统限制
sysconf()
、pathconf()
、fpathconf()
供应用程序调用以检查系统实现的限制和选项。
#include <unistd.h>
long sysconf(int name);
Returns value of limit specified by name,
or -1 if limit is indeterminate or an error occurred
- 参数
name
应为定义于<unistd.h>
文件中的_SC_
系列常量之一,限制值将作为日函数结果返回。 - 若无法确定某一限制,则
sysconf()
返回-1。 - 若调用时发生错误,也会返回-1(唯一指定的错误是EINVAL,表示name无效)。
为了区别返回-1的情况,应在调用函数前将errno
设置为0,如果调用返回-1,且带哦用后errno
值不为0,则sysconf()
调用发生错误。
限制值在进程运行期间不会改变。
运行时获取与文件相关的限制
#include <unistd.h>
long pathconf(const char *pathname, int name);
long fpathconf(int fd, int name);
Both returns value of limit specified by name,
or -1 if limit is indeterminate or an error occured.
pathconf()
与fpahconf()
唯一的区别是对文件或目录的指定方式,前者是路径名方式,后者是文件描述符。- 参数
name
是定义于<unistd.h>
中的_PC_
系列常量,限制的值将作为函数调用结果返回。
限制值在进村运行期间可能会改变,例如当重新装载文件系统时。
不确定的限制
有时系统实现并未将一些系统限制定义为限制常量(比如PATH_MAX),并且sysconf()
或pathconf()
在返回相应限制时会将其归为不确定。对此,
- 参考SUSv3规定的最低限制值,并结合实际。
- 省去限制检查,根据出错结果进行判断并重试/修改。
- 自行编写程序或函数对限制值进行推断或估算。