UNIX standard
ISO C
ISO C是国际标准化组织给出的C语言的标准。它包含两部分:C语言的语法和语义,标准库。但是标准只是给出了C标准函数的原型和功能,并没有给出他们的实现。具体的实现由编译器决定,只要编译器声称它们支持ISO C标准,那么这个编译器就必须严格遵守ISO C标准中的各项规定。
ISO C标准现在由ISO/IEC的C程序国际标准工作组维护和开发,该工作组称为ISO/IEC JTC1/SC22/WG14,简称WG14。ISO C标准的目的是提供C程序的可移植性,使其能适合大量不同的操作系统,而不仅仅是适合UNIX系统。
根据C语言的发展来说:
1972年,丹里斯发明了C语言,这个版本的C语言叫做K&R C。
ISO C的前身是ANSI C,1989年,美国国家标准学会(ANSI)提出了ANSI标准X3.159-1989,这个标准就是ANSI C,它也被采纳为国际标准ISO/IEC 9899:1990,也就是ISO C90。其中IEC是国际电子技术委员会的缩写。后来陆续有了ISO C99,ISO C11等标准。
按照ISO标准定义的头文件,可以将ISO C库分为24个区。下面要介绍的POSIX.1标准包含ISO C的头文件以及另外一些头文件。
IEEE POSIX
POSIX是由国际电气和电子工程学会制定的标准族。POSIX是可移植操作系统接口(Portable Operating System Interface)。它原来只是IEEE操作系统接口的标准1003.1,后来扩展成了许多其他标准和标准草案,如shell和实用程序等。
和本书相关的是操作系统接口标准,它的目的是提高应用程序在各种UNIX操作系统之间的可移植性。它定义了符合POSIX的操作系统必须提供的各种服务,但是它并不局限于UNIX和类UNIX类的系统。
由于1003.1标准只给出了接口而不是一种实现,所以并不区分系统调用和库函数。1988版本的1003.1标准,即1003.1-1988递交给了ISO,最后作为IEEE标准1003.1-1990正式出版,这就是国际标准ISO/IEC 9945-1:1990,通常也称为POSIX.1。
Single UNIX Specification
单一UNIX规范(SUS)是POSIX.1标准的一个超集,它对POSIX.1进行了扩展,POSIX.1相当于SUS的基本规范部分。
POSIX.1中的X/Open系统接口(XSI)选项描述了可选的接口,也定义了遵循XSI的实现必须支持POSIX1的哪些可选部分,这些必须支持的部分包括:文件同步,线程栈地址,长度属性,线程进程共享同步以及_XOPEN_UNIX
符号常量,只有遵循SXI的实现才能称为UNIX系统。
UNIX implement
- SVR4
- 4.4BSD
- FreeBSD
- Linux
- Mac OS X
- Solaris
- 其他UNIX系统
标准和实现的关系
标准其实是任一实际系统的子集。
限制
UNIX实现定义了很多幻数和常量。已经有若干种可以移植的方法确定这些幻数和具体实现定义的限制。以下两种类型的限制是必须的:
- 编译时限制,比如
int
的最大值是什么。 - 运行时限制,比如文件名的字符,这个只有在我们运行程序时才能知道。
编译时限制可以在头文件中定义。程序在编译时可以包含这些头文件,运行时限制需要进程调用另一个函数获得限制值。
但是有时候可能某些限制在给定的实现中是固定的,而在另一个实现中是变动的。比如文件的名字。为了解决这类问题,提供了以下三种限制:
- 编译时限制
- 与文件和目录无关的运行时限制(
sysconf
函数) - 与文件和目录有关的运行时限制(
pathconf
函数和fpathconf
函数)
ISO C限制
包含在<limits.h>
头文件中,ISO C标准给出了各种类型的最小范围,每个实现必须满足这个最小范围,具体取多少由实现决定。常见的比如int
, float
,char
等的最大值和最小值。以及可同时打开的标准I/O流的最小个数。
POSIX限制
POSIX.1定义了大量限制和常量,我们只关心和基本POSIX.1接口有关的部分。它们被分为以下7类:
- 数值限制
- 最小值
- 最大值
- 运行时可以增加的值
- 运行时不变值
- 其他不变值
- 路径可变名
这些限制有些在<limits.h>
中定义,其余的限制按具体条件可以定义,可以不定义。
XSI限制
- 最小值
- 运行时不变值
sysconf
, pathconf
和fpathconf
如何获得一个特定系统中实际支持的限制值?
- 某些限制值在编译时是可以使用的,而有些限制值只有在运行时才能确定。
- 也有某些限制值在一个给定的系统中可能是不会改变的,而其他限制值可能会改变,因为它们与文件和目录相关。
运行时限制可以通过下面三个函数之一获得:1
2
3
4
5
long sysconf(int name);
long pathconf(const char *pathname, int name);
long fpathconf(int fd, int name);
// 所有函数如果成功,返回相应值,出错,返回-1
选项
基本系统数据类型
头文件<sys/types.h>
定义了许多和实现相关的数据类型,它们被称为基本系统数据类型。这些数据类型都是用C的typedef定义的,大多数以_t
结尾。常见的如下:
clock_t
gid_t
uid_t
pid_t
pthread_t
ptrdiff_t
size_t
ssize_t
time_t
标准之间的冲突
如果出现冲突,POSIX.1服从ISO C标准。
参考文献
1.《APUE》
2.https://www.zhihu.com/question/40175738/answer/154308906