UNIX标准化
这一节介绍了三个重要的标准
- ISO C
- POSIX
- SUS
ISO C
由于C语言在UNIX系统中的地位不言而喻,C语言的标准化也是UNIX标准化的重要组成部分。ISO C标准当中包括了
- 语法和语义
- 标准库
时间线:1989(发布)-1999(更新)-2001 2004 2007 (勘误)-2011(更新)
IEEE POSIX
POSIX(Portable Operating System Interface,可移植操作系统接口)
指的是IEEE 1003的各种标准,这里只关注POSIX.1.该标准囊括了符合该标准的计算机操作系统应该具有的接口。标准定义了必须和可选的一些头文件,同时也包含了ISO C标准库函数。
Single UNIX Specification
单一UNIX规范,看名字就觉得这个跟UNIX关联更大一些,它是POSIX.1的一个超集,随POSIX.1同步更新,吸收新的技术规范。
实现
略
限制
这是一个重要的话题
为什么要引入限制?
- 原因:UNIX定义了大量的幻数/常量并且应用程序需要使用到,而且这些常量在不同实现上,不同机器上是不同的。
- 用途:确定这些幻数和具体实现定义
- 种类:编译时限制(在头文件中获取)/运行时限制(调用系统函数)
ISO C限制/POSIX限制/XSI限制
基本都是编译时限制
运行时限制
三个函数
#include <unistd.h>
long sysconf(int name);
long pathconf(const char* pathname, int name);
long fpathconf(int fd, int name);
name参数带入一些宏定义以得到特定的限制数。
不确定的运行时限制
本书中的实现采取了分级式的限制数获取方式,给了两个例子
- 路径名
- 最大文件打开数
基本格式就是
#ifdef XXX//可能在limits.h中的宏定义
static long xxx = XXX;//第一级
#else
static long xxx = 0;
#endif
#define XXX_GUESS _xxx
func() {
if (xxx == 0){
errno = 0;
if (xxx = sysconf(----) < 0) //第二级,但是sysconf中没有获取到的话会返回-1
{
if (errno == 0) //没有报错
xxx = XXX_GUESS;//第三级,无奈只能猜了
else
err_sys();
} else {
//sysconf里面有,可以做进一步处理
}
}
}
习题
1
类似于这样吧,用 “xxx_defined”来指示当前环境下是否定义过,定义过就跳过,没定义过就定义一次,然后define一下 “xxx_defined”