系统限制和选项在不同系统实现、不同的运行环境、不同的文件系统之间可能存在不同。

程序获取限制值有两种途径:

  • 在编译程序时能获得一些限制和选项,例如int类型的最大值,可以在头文件中定义。

  • 在程序运行时可能变化的限制和选项,可以通过sysconf()、pathconf()、fpathconf()函数在检查系统限制和选项。

系统限制

头文件limits.h中形如_POSIX_XXX_MAX为SUSv3标准所定义的的各类系统限制的最小值。每个限制有一个名称,形如XXX_MAX,该限制至少等同于标准所定义的值,即XXX_MAX >= _POSIX_XXX_MAX。

SUSv3将限制分为三类:运行时恒定值、路径名变量值和运行时可增加值。

  • 运行时恒定值(可能不确定)
    所谓运行时恒定值是指某一限制,若已然在limits.h文件中定义,则对于实现而言固定不变。然而该值可能是不确定的,因而在limits.h文件中会忽略对其定义。在这种情况下,即使limits.h文件中已定义,应用程序可以使用sysconf来获取运行时的值。

  • 路径名变量值
    指与路径名(文件、目录、终端)相关的限制,应用程序可以通过pathconf()或fpathconf()来获取该值。

  • 运行时可增加值
    运行时可增加值是指某一限制,相对于特定实现其值固定,且运行此实现的所有系统至少都应支持这一最小值。然而,特定系统在运行时可能会增加该值,应用程序可通过sysconf来获取系统所支持的实际值。

在运行时获取系统限制

1
2
#include <unistd.h>
long sysconf(int name);

参数name应为定义于<unistd.h>文件中的_SC_系列常量之一。

运行时获取和文件相关的限制

1
2
3
4
#include <unistd.h>

long pathconf(const char* pathname, int name);
long fpathconf(int fd, int name);

两个函数之间的区别在于其对于文件或目录的指定方式,参数name则是定义于<unistd.h>文件中的_PC_*常量之一。

系统选项

定义在unistd.h中:

  • 值为-1, 表示实现不支持该选项。
  • 值为0, 表示实现可能支持该选项。
  • 值大于0, 表示实现支持该选项。