第二章 UNIX标准化及实现
-
UNIX标准化
- ANSI C:标准的意图时提供C程序的可移植性
- IEEE POSIX(计算机环境的可移植操作系统界面)
- X/Open XPG3
- FIPS(联邦信息处理标准)
-
UNIX实现:标准只是界面的规格说明,实施由制造商采用具体实现
- SVR4
- 4.3+BSD
-
限制:用于确定幻数(为常数,但无法确定具体代表与实际意义)与实现定义
-
必须的限制功能:
- 编译时间选择项(系统是否支持作业控制)
- 编译时间限制(短值型的最大值是什么)
- 运行时间限制(文件名的最大字符数是多少)
-
由于限制在一个给定的实现中可能是固定的,另一个实现上可能是变动的,解决以上问题提供三种限制:
- 编辑时间选择项及限制(头文件)
- 不与文件或目录相关联的运行时间限制
- 与文件或目录相关联的运行时间限制
-
ANSI C限制:编译时间限制
<limits.h>中定义了C标准限制;区分带符号与不带符号的字符值;<float.h>中定义浮点数据;<stdio.h>定义FOPEN_MAX即可同时打开的标准I/O流的最小数
-
POSIX限制:POSIX.1定义了很多设计操作系统实现限制的常数,包括33个限制和常数分为八类;其中15个必须定义;但是13个不变最小值对于程序太小;
-
XPG3限制:7个常数
-
运行时间限制由sysconf、pathconf和fpathconf函数调用取得,其中pathconf的参数pathname和fpathconf残烛filedes由很多限制,若不满足则结果未定义
-
FIPS 151-1要求:
要求下列POSIX.1可选功能:_POSIX_JOB_CONTROL, _POSIX_SAVED_IDS, POSIX NO_TRUNC, POSIX_CHOWN_RESTRICTED和POSIX_VDISABLE。
• NGROUPS_MAX的最小值是8。
• 新创建的文件或目录的组ID应设置为它所在目录的组ID。
• 已传输了一些数据后,若read或write被一个捕捉到的信号所中断,则这些函数应返回已被传输的字节数。
• 登录shell应定义环境变量HOME和LOGNAME。 -
总结:_SC_开始的为sysconf的参数,_PC_为其余的参数
-
未确定的运行时间限制:
第三列标记为可选的值为未确定的。头文件中未定义则编译时不能使用,但若值未确定,在运行时可能也未定义
-
路径名
程序需要为路径名分配存储器,编译时通常分配并使用幻数为数组长度或BUFSIZ。POSIX.1使用PATH_MAX,但如果此值不确定则无用处。使用PATH_MAX时若在<limits.h>中定义了常数,便可用,否则需调用pathconf,因为pathconf的返回值把第一个参数视为基于工作目录的相对路径名,并将其加1作为结果值。
-
最大打开文件数
-
-
-
功能测试宏
在编译程序时,若想只使用POSIX定义,需定义常数_POSIX_SOURCE。_POSIX_SOURCE便是功能测试宏。
功能测试宏包括:_POSIX_SOURCE;_XOPEN_SOURCE;STDC(符合ANSI C标准)
使用方法:
-
cc命令行:cc -D_POSIX_SOURCE file.c
-
源文件中第一行:#define _POSIX_SOURCE 1
-
文件中:
#ifdef _STDC_ //判断是否ANSI C编译 void *myfunc (const char *); #else void *myfunc(); #endif
-
-
基本系统数据类型
在<sys/types.h>中定义了与实现有关的数据类型,成为基本系统数据类型。
-
标准之间的冲突:略