[UNIX编程笔记] 【APUE-4】 UNIX标准化及实现与sysconf、fpathconf、pathconf函数

UNIX系统实现定义了很多幻数和常量,很多已经被硬编码到程序中,或用特定的技术确定了。

以下两种类型的限制是必需的:

1.编译时限制(例如,短整型的最大值是什么?)

2.运行时限制(例如,文件名可以有多少个字符)

某些限制在一个给定的实现中可能是固定(因此可以静态地在一个头文件中定义),而在另一个实现上则可能是变化的(需要有一个运行时函数调用)

为了解决这样的限制问题,提供了一下三种方式:

1.编译时限制(头文件)

2.不与文件或目录相关联的运行时限制(sysconf函数)

3.与文件或目录相关联的运行时限制(pathconffpathconf函数)


sysconf- 运行时获取系统配置信息

摘要

#include<unistd.h>


longsysconf(int name);

描述

POSIX允许一个应用程序在编译和运行时测试某个选项或参数是否被支持,或是这个值在某些配 置下是固定不变的(即可配置的)或是有限制的


在编译时,这样的限制通过包含<unistd.h>and/or <limits.h>头文件

并且测试某一个宏的值


在运行时,任何人可以通过使用已有的sysconf()函数获得一个数值量(long型值).任何人也可以通过fpathconf(3)pathconf(3)函数返回与系统中文件和

目录相关的这样的参数.任何人也可以通过confstr(3)返回字符串型的值.


从这几个函数获得的这些值是系统配置的一些常量. 通常他们在进程的生存期内不发生改变(在apueP41页有更多的阐述).


所有选项中,类似_POSIX_FOO的常量通常可能定义在<unistd.h>. 如果它并未被定义,我们应当在运行时尝试获取、调用.

如果选项值被定义为-1,那么此选项值并不被支持.

如果选项值被定义为0,那么相关的函数和头文件是存在的,但是我们通常在运行时获得它所被支持或是限制的程度(为某个数值)究竟是多少.

如果选项值被定义为其他的值,那么这个选项是被支持的.

通常这个值(例如200112L)指示POSIX版本描述这个选项的年、月

标准C使用1来指示还没有在POSIX标准被发布的却已支持的选项.


sysconf()函数的参数形如 _SC_FOO. 选项的列表可以详见man手册页中的posixoptions(7).(将在后文给出)


对于一些数值或是限制,通常有一个 类似 _FOO常量,可能是在 <limits.h>中定义了,或是类似 _POSIX_FOO,则可能被定义在<unistd.h>头文件中.

如果某个限制没有每定义或指出那么相应就不会有常量被申明定义.如果某个常量被定义,它提供了一个保障性的值,可能更大的数值也能得到支持.

如果一个程序希望利用各个系统之间数值的不同带来的好处、优势,便可以调用sysconf()函数.

sysconf()的参数形如_SC_FOO.


POSIX.1Variables

我们列出变量的名称,sysconf()调用该变量时用到的参数的名称并为其附上简短的说明.


-------首先是POSIX.1兼容的选项值.

ARG_MAX- _SC_ARG_MAX

exec函数的参数最大长度. 长度最短不小于 _POSIX_ARG_MAX(4096).

CHILD_MAX- _SC_CHILD_MAX

每个实际用户ID的最大进程数. 至少为 _POSIX_CHILD_MAX(25).

HOST_NAME_MAX- _SC_HOST_NAME_MAX

gethostname函数返回的主机名最大长度. 长度至少为 _POSIX_HOST_NAME_MAX(255).

LOGIN_NAME_MAX- _SC_LOGIN_NAME_MAX

登录名的最大长度,包括终止的空字符.不得小于 _POSIX_LOGIN_NAME_MAX(9).

clockticks - _SC_CLK_TCK

每秒钟时钟滴答数. 同样可以称为 CLK_TCK.

(Note:数量更大的 CLOCKS_PER_SEC并不意味着一定等于1000000.)

OPEN_MAX- _SC_OPEN_MAX

每个进程的最大文件打开数. 不能少于 _POSIX_OPEN_MAX(20).

PAGESIZE- _SC_PAGESIZE

系统存储页长度. 至少为n1. (Some sys‐

temsuse PAGE_SIZE instead.)

RE_DUP_MAX- _SC_RE_DUP_MAX

当时用间隔表示法\{m,n\}时,regexecregcomp函数允许的基本正则表达式的重复出现的次数.至少为_POSIX2_RE_DUP_MAX(255).

STREAM_MAX- _SC_STREAM_MAX

在任一时刻每个进程的最大标准I/O流数:如若定义,则其值一定与FOPEN_MAX相同.至少为 _POSIX_STREAM_MAX(8).

SYMLOOP_MAX

在解析路径名称期间,可遍历的符号链接数.至少为 _POSIX_SYMLOOP_MAX(8).


TTY_NAME_MAX- _SC_TTY_NAME_MAX

终端设备名长度,包括终止字符null. 长度至少为 _POSIX_TTY_NAME_MAX (9).


TZNAME_MAX- _SC_TZNAME_MAX

时区名的最大字节数.至少为_POSIX_TZNAME_MAX(6).


_POSIX_VERSION- _SC_VERSION

YYYYMML的格式指明POSIX.1标准发布的年月.

1990.

man手册页中还包含了一些POSIX.2标准的选项,篇幅问题,我将其省去了,主要是我个人现在的水平还用不上那些所有的选项

就算是偷懒了~~~


返回值

如果选项名是非法的,函数返回-1,errno指明为EINVAL.其他情况,返回系统资源的限制值 且 errno值不会改变.

一个选项如果被支持则返回一个正值,否则返回-1.在这种情况下,-1没有相关限制的定义.




fpathconf,pathconf - 获取文件的配置参数


摘要:

#include<unistd.h>

longfpathconf(int fd, int name);

longpathconf(char *path, int name);

描述

fpathconf()获取文件描述符为fd的可打开文件的配置选项的值.


pathconf()获取文件路径名称为path的可打开文件的配置选项的值.

头文件<unistd.h>中定义了相对应的宏的最小值.


设置一下的常量将获得相应的选项的值:

_PC_LINK_MAX

文件链接数的最大值. 如果 fd或是 path代表一个文件夹,则返回值对应整个文件夹. 其对应的宏为 _POSIX_LINK_MAX.


_PC_MAX_CANON

终端规范输入队列的最大字节数. 其对应的宏为 _POSIX_MAX_CANON.


_PC_MAX_INPUT

终端输入队列可用空间的字节数. 其对应的宏为_POSIX_MAX_INPUT.


_PC_NAME_MAX

文件名的最大字节数(不包括终止符null. 其对应的宏为 _POSIX_NAME_MAX.


_PC_PATH_MAX

相对路径名的最大字节数. 其对应的宏为 _POSIX_PATH_MAX.


_PC_PIPE_BUF

能原子地写到管道的最大字节数. 其对应的宏为 _POSIX_PIPE_BUF.


_PC_CHOWN_RESTRICTED

如果 chown(2)函数不能在此文件(夹)调用则返回非0. 其对应的宏为 _POSIX_CHOWN_RESTRICTED.


_PC_NO_TRUNC

返回非零的数值指明路径名长于_POSIX_NAME_MAX是否将会产生错误. 其对应的宏为_POSIX_NO_TRUNC.


_PC_VDISABLE

若定义,可以使用此值禁用终端特殊字符.


返回值

如果选项存在,将返回其限制的值. 如果系统中没有此选项,则将返回-1,errno 并不会改变.

如果发生错误,将返回-1,errno就出错的情况发生相应改变.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值