您的位置:首页 > 编程语言

《UNIX环境高级编程》笔记--UNIX标准化及实现

2013-09-01 20:37 190 查看

1.UNIX标准化

1.1.ISO C

1989 年后期,C程序设计语言的ANSI(American National Standards Institute) 标准X3. 15 9-1989得到批准( ANSI 1989) 。
此标准已被采用为国际 标准 ISO/IEC 9899:1990。
1999年,ISO C给根性为ISO/IEC 9899:1999。
按照ISO C标准定义了各个头文件(header),可将ISO C库分成24个区。下表列出了C标准定义的各个头文件。



1.2.IEEE POSIX

POSIX是一系列由IEEE(Institute of Electrical and Electronics Engineers)制定的标准,POSIX(Portable Operating System

Interface)是指可移植的操作系统接口。

POSIX标准通常被称为POSIX.1,下面各表总结了POSIX.1指定的必需和可选的头文件。因为POSIX.1包含ISO C标准库函数,所

以还需要ISO C中列出的头文件。

POSIX标准定义的必需的头文件



POSIX标准定义的XSI扩展头文件



POSIX标准定义的可选头文件



POSIX接口可以分为必需接口和可选接口,可选接口按功能又进一步分成50个区,下表总结了没有被弃用的编程接口。



1.3.Single UNIX Specification

Single UNIX Specification(单一UNIX规范)是POSIX.1标准的一个超集,它定义了一些附加的接口,这些接口扩展了POSIX.1

规范所提供的功能。相应的系统接口全集被称为X/open系统接口(XSI,X/Open System Interface)。__XOPEN_UNIX符号常量标识

了XSI扩展的接口。

XSI还定义了必须支持POSIX.1中的哪些可选部分才能认为是遵循XSI的(表中的SUS强制要求),只有遵循XSI的实现才能成为UNIX

系统。

1.4.FIPS

FIPS的含义是联邦信息处理标准(Federal Information Processing Standard),它是由美国政府出版,用于计算机系统的采购,

因为FIPS的影响正逐步减退,所以在本书中不再进一步考虑它。

2.UNIX系统实现

UNIX主要有三个分支:

1.AT&T分支,导出了系统Ⅲ和系统Ⅴ(UNIX商用版本)

2.加州大学伯克利分校分支,导出了4.xBSD实现。

3.AT&T贝尔实验室的计算机科学研究中心开发的UNIX研究版本,导出UNIX分时系统第8,9版以及于1990年发布的最后一版第10版。

UNIX系统主要有:

SVR4:UNIX SystemⅤ release 4.

4.4BSD:加州大学伯克利分校的计算机系统研究组研究开发和分发的。

FreeBSD:加州大学伯克利分校的计算机系统研究组决定终止其在UNIX操作系统的BSD版本上的研发中作后,设立了FreeBSD项目。

LINUX:其实不是UNIX,linux使用的是linux内核,只是提供了UNIX编程环境

Mac OS X:核心操作系统成为Darwin,基于Mach内核和FreeBSD系统的组合。

Solaris:由Sun公司开发的UNIX系统版本。

AIX:IBM版的UNIX。

HP-UX:HP版的UNIX。

IRIX:Silicon Graphics版的UNIX。

Unix Ware:SVR4派生的UNIX系统。

3.限制

UNIX系统实现定义了很多变量和常量,而且每个实现可能都不一样,为了能够促进标准化(有助于软件的可移植性),使用以下两种

类型的限制:

1.编译时限制(例如:短整型最大值是多少?)

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

对于上面的2中限制具体是怎么实现的呢:

1.编译是限制(使用头文件)

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

3.与文件或目录相关联的运行时限制(使用pathconf函数和fpathconf函数)

3.1.ISO C限制

ISO C定义的限制都是编译时限制。限制的常量都定义在头文件中,而且在一个系统中不会改变,例如在linux系统的/usr/include/limits.h

文件中定义了ISO C限制。

3.2.POSIX限制

POSIX.1的限制和常量被分成下列5类。

1.不变的最小值,如下图所示:



2.不变值:SSIZE_MAX

3.运行时可以增加的值:CHARCLASS_NAME_MAX,COLL_WEIGHTS_MAX,LINE_MAX,NGROUPS_MAX和RE_DUP_MAX。

4.运行时不变的值(可能不确定):ARG_MAX,CHILD_MAX,HOST_NAME_MAX,LOGIN_NAME_MAX,OPEN_MAX,PAGE_SIZE,

RE_DUP_MAX,STREAM_MAXS,SYMLOOP_MAX,TTY_NAME_MAX和TZNAME_MAX。

5.路径名可变值(可能不确定):FILESIZEBITS,LINK_MAX,MAX_CANON,MAX_INPUT,NAME_MAX,PATH_MAX,PIPE_BUFF

和SYMLINK_MAX。

3.3.XSI限制

XSI还定义了处理实现限制的下面几个常量:

1.不变最小值。



2.数值限制:LONG_BIT和WORD_BIT.

3.运行时不变值(可能不确定):ATEXIT_MAX,IOV_MAX和PAGE_SIZE。

3.4.sysconf函数,pathconf函数和fpathconf函数

这3个函数都是获取运行时限制时取得的。定义如下:

#include <unistd>
long sysconf( int name );
long pathconf( const char *pathname, int name  );
long fpathconf( int fd, int name );


sysconf函数的限制及name参数如下:



pathconf函数和fpathconf函数的限制及name参数如下:



这3个函数返回值代表的含义如下:

1.如果name不在上面的2个表中,则函数返回-1.并将errno设置为EINVAL。

2.有些name返回-1,这表示该值是不确定的,此时并不改变errno的值。

可以使用下面的代码判断函数返回值:

long val;
errno = 0;
if((val = sysconf(name)) < 0){
if(errno != 0){
if(errno == EINVAL){
printf("not supported.\n");
}else{
printf("sysconf error");
}
} else {
printf("no limit\n");
}
}else{
printf("%ld\n",val);
}


4.选项

在介绍POSIX标准是讲到了POSIX的选项(可选接口),如果我们程序与选项相关,需要确定系统是否支持该选项。

XSI定义了3种处理方法:

1.编译时预定义在<unistd.h>中。

2.与文件或目录无关的选项用sysconf函数确定。(name参数前缀_POSIX必须替换为_SC)

3.与文件或目录相关的选项用pathconf或fpathconf函数确定。(name参数前缀_POSIX必须替换为_PC)

如果符号常量未定义,则必须调用sysconf,pathconf或fpathconf以确定相应的选项是否受到支持。

如果该平台定义了符号常量,则有3种可能:

1.如果符号常量定义为-1,那么该平台不支持相应的选项。

2.如果符号常量定义大于0,那么该平台支持相应的选项。

3.如果符号常量定义为0,则必须调用sysconf,pathconf或fpathconf以确定相应的选项是否受到支持。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: