System Limits and Options

系统限制

针对 SUSv3 所规范的每个限制,所有实现都必须支持一个最小值。<limits.h>POSIX_XXX_MAX

在运行时获取系统限制

1
2
3
#include <unistd.h>

long sysconf(int name);

sysconf()函数允许应用程序在运行时获得系统限制值。【参数 name 应为定义于<unistd.h>文件中的SC常量之一。】

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "tlpi_hdr.h"

/* Print 'msg' plus sysconf() value for 'name' */
static void sysconf_print(const char *msg, int name)
{
    long lim;
    errno = 0;
    lim = sysconf(name);
    if (lim != -1)
    {
        printf("%s %ld\n", msg, lim);
    }
    else
    {
        if (errno == 0) /* Call succeeded, limit indeterminate */
            printf("%s (indeterminate)\n", msg);
        else /* Call failed */
            errExit("sysconf %s", msg);
    }
}

int main(int argc, char *argv[])
{
    sysconf_print("_SC_ARG_MAX:        ", _SC_ARG_MAX);
    sysconf_print("_SC_LOGIN_NAME_MAX: ", _SC_LOGIN_NAME_MAX);
    sysconf_print("_SC_OPEN_MAX:       ", _SC_OPEN_MAX);
    sysconf_print("_SC_NGROUPS_MAX:    ", _SC_NGROUPS_MAX);
    sysconf_print("_SC_PAGESIZE:       ", _SC_PAGESIZE);
    sysconf_print("_SC_RTSIG_MAX:      ", _SC_RTSIG_MAX);
    exit(EXIT_SUCCESS);
}

调用 sysconf 所获取的值在调用进程的生命周期内应保持不变

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

1
2
3
4
#include <unistd.h>

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

pathconf 和 fpathconf 函数允许应用程序在运行时获取文件相关的限制值

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "tlpi_hdr.h"

static void fpathconf_print(const char *msg, int fd, int name)
{
    long lim;
    errno = 0;
    lim = fpathconf(fd, name);
    if (lim != -1)
    { /* Call succeeded, limit determinate */
        printf("%s %ld\n", msg, lim);
    }
    else
    {
        if (errno == 0) /* Call succeeded, limit indeterminate */
            printf("%s (indeterminate)\n", msg);
        else /* Call failed */
            errExit("fpathconf %s", msg);
    }
}

int main(int argc, char *argv[])
{
    fpathconf_print("_PC_NAME_MAX: ", STDIN_FILENO, _PC_NAME_MAX);
    fpathconf_print("_PC_PATH_MAX: ", STDIN_FILENO, _PC_PATH_MAX);
    fpathconf_print("_PC_PIPE_BUF: ", STDIN_FILENO, _PC_PIPE_BUF);
    exit(EXIT_SUCCESS);
}

不确定的限制

  • 编写一个可在多个 UNIX 实现间移植的应用程序时,可选择使用 SUSv3 所规定的最低限制值。
  • 省去对限制的检查,取而代之以执行相关的系统调用或库函数
  • 自行编写程序或函数
  • GNU autoconf
Licensed under CC BY-NC-SA 4.0
Get Things Done
Built with Hugo
Theme Stack designed by Jimmy