分类: LINUX
2008-12-09 12:57:02
国际C语言标准(ISO C):
ISO C是C编程语言的标准,适用于一切使用C语言编程的场合;
目前存在两个版本的国际C标准,一个是C89,即一般C语言教科书中提到的ANSI C,这是通行的实际标准;
另一个是C99,主要是在兼容C89的基础进行了扩充,例如增加了restrict(强制所修饰类型只能为指针的修饰符)、inline(内联修饰符,以inline修饰的函数编译时直接在调用处展开而不进行栈操作)等关键词,增加了宽字节(主要应用于Unicode场合)头文件
C99共定义了24个头文件。其中Linux的GNU C库全部实现,其它的UNIX平台也不同程度的实现了大部分。
内核本身通常没有C库函数接口,如Linux的内核。
可移植操作系统接口(POSIX,Portable Operating System Interface):
POSIX由IEEE制定,通过ISO进行标准化;
这个名称据说是RMS建议起的(见于ESR的《UNIX编程艺术》一书);
颁发POSIX的目的是标准化各类UNIX系统接口,以提高它们的应用程序在源代码级上的可移植性;
POSIX定义了遵循它的操作系统必需提供的操作系统服务接口。
POSIX不指出哪些接口是系统调用,哪些是库函数。而将其交由遵循此标准的系统去自由实现;
POSIX并未专门要求应用程序在二进制机器码层次上的可移植性;
当前通行的标准为POSIX.1,另有POSIX.1b(POSIX线程扩展)和POSIX.1c(实时扩展)。
ISO C标准库函数被定义为POSIX.1的一个子集,另外还包括了26个头文件,26个扩展头文件,8个可选头文件;
POSIX.1本身没有专门定义超级用户的概念,但对一些操作要求区分操作权限;
单一UNIX规范(SUS,Single UNIX Specification)与X/Open系统接口(XSI,X/Open System Interface):
由UNIX商标的拥有者Open Group发布,是POSIX.1的一个扩展超集),Open Group的前身即为X/Open;
SUS的全集称为XSI;
一个UNIX-like系统在拿到UNIX商标之前,需要保证遵循XSI并服从SUS的强制要求;
SUS的最新标准为SUS v3,发布于2004年,并经过了ISO的标准化;
SUS v3的主要内容分为4个部分:基本定义、系统接口、Shell和实用程序以及基本理论;
文件系统层次标准(FHS,Filesystem Hierarchy Standard)Linux标准基础(LSB,Linux Standard Base):
这两个标准主要是由自由标准组织FSG(Free Software Group)制定和维护的,APUE书中没有提及,但在实际开发UNIX应用程序时,还是有参考价值;
FHS定义了UNIX-like的操作系统中文件系统结构组织的规范,例如各类配置文件、应用程序、应用程序资源文件及数据文件等应该放在什么目录下等等;这里有一篇。
LSB是为缩小Linux内核下不同发行版之间的差异并进行某种统一而制定的标准,包括了:致力于应用程序在机器码级别上的兼容性、确定诸如GTK、OpenGL、Fontconfig等库的接口规范等多个方面,它本身集成了FHS标准;这里有一篇介绍文章。
LSB标准将于今年年底更新到4.0。
还有其它一些标准在UNIX系统编程中可能也会遇上,如TCP/IP协议、Sun RPC、RFC、i18n等,APUE书中未对此专门描述,这里略。
UNIX简史:
这部分APUE上没有细述,ESR的《UNIX编程艺术》一书中有比较详细的介绍,这里作为行业文化与传统的知识背景稍微补充扩展一下。上有一个通过时间线介绍的,或者可以通过google timeline看UNIX更详细的;
第一个UNIX诞生于1969年的贝尔实验室,作者是Ken Thompson和Dennis Ritchie。1971年开始投入实际应用,1973年用C语言改写,开始在各类平台的计算机上进行移植;
以后的UNIX分支主要来源于1976年的UNIX v6和1979年的UNIX v7。这里有一张。分支最终导致了标准的诞生。
最重要的两个分支为:AT&T的System V,其最终版本为SVR4(System V Release 4),发布于1989年、加州大学伯克利分校的BSD(Berkeley Software Distribution),其最终版本为4.4BSD,发布于1994年。目前互联网上都提供了这两个版本的源代码自由下载;
POSIX主要是在System V分支的基础上制定,同时引进了套接字等在BSD分支上比较领先的领域;
历史上,一般“UNIX机器”名称的涵义包括了包括操作系统实用工具与外围磁带设备等在内的整套计算机软硬件;
RMS于1983年创建了;并于1985年,成立了并发表了GNU宣言; 在1989年发表了第一版;从此,贯穿 和深刻影响了以后的UNIX史;
ESR于1997年发表了评论文章“”,这篇文章成为 运动的重要旗帜文章,从UNIX领域开始并往外推广,影响并几乎重新洗牌了整个软件业界的开发模式;
Linux
Linux是在POSIX标准指导下发布的独立UNIX分支,使用GPL许可证;
Linux由Linus Torvalds于1991年首次发布,并由其维护至今;
Linux商标由Linus Torvalds本人持有,但Linux本身不拥有UNIX商标;
Linux到目前为止的最新版本为2.6.27,可以在自由其完整源代码;
由于其自由开放的开发模式,Linux受到了世界各地程序员的欢迎和自发贡献和测试源码,并移植到了各种计算机体系结构上。目前已经广泛应用于包括从超级计算机到家用电脑到嵌入式设备的各个领域;
FreeBSD
FreeBSD项目开始于经典的BSD项目停止后的1994年,为4.4BSD-Lite的直系后裔;
FreeBSD项目最早基于Intel 80386下开发,今天也已经移植到了多种体系结构上;
FreeBSD项目由“FreeBSD Project”组织维护,使用BSD许可证;
FreeBSD操作系统主要应用于服务器领域,以成熟稳定、高可靠性著称;
最新版本为FreeBSD 7,并计划于2009年第二季度发布FreeBSD 8;
Mac OS X
Mac OS X的正式版本发布于2001年,为苹果电脑公司的产品;
Mac OS X内核称为Darwin,在Mach微内核和FreeBSD的基础上开发;
Mac OS X运行于主要运行于苹果计算机的PowerPC处理器,苹果计算机现在也发布了Intel 80x86体系结构的产品;
Mac OS X致力于桌面环境,其产品理念沿袭其前身Macintosh操作系统的Mac界面方针,注重于人机交互体验的UI设计,在此基础上发布了很多不同于传统UNIX理念的独特而优秀的产品;
Mac OS X的最新版本为Leopard。发布于2007年,对应版本号为Mac OS X 10.5;
Solaris
Solaris的前身Sun OS最早在BSD的基础上开发,但自Sun OS 5开始改为SVR4。为SUN微系统公司的产品;
Solaris主要运行在SUN公司的SPARC体系结构上,但现在也开始支持x86;
从Solaris 10开始,该系统通过OpenSolaris项目以开源产品的形式发布,但本质上仍属于私有软件而不是自由软件;
Solaris是一个企业级的操作系统,有多年的商业成功案例,广泛应用于商业中小型机;
其它UNIX-like系统
拥有UNIX商标的商业级UNIX:IBM AIX、HP-UX、SCO UNIX等,与Solaris一时瑜亮;
OpenBSD和NetBSD:同样使用BSD许可证的BSD分支后代,OpenBSD以其出色的安全性能著称,而NetBSD注重于跨平台;
GNU的Hurd:为GNU操作系统计划中的操作系统内核。它实际上被设计为基于GNU Mach微内核之上的一系列操作系统服务;
Cygwin:项目开始于1995年,致力于Microsoft WinNT内核上实现兼容POSIX的API,使之成为一个Windows下的UNIX仿真(而不是虚拟)环境。目前已经成功移植了从shell到X Window及其编程环境在内的大多数工具和库函数;
Plan9:为贝尔实验室从80年代中期开始规划设计的兼容UNIX接口的同时超越UNIX的下一代操作系统;
另外L4、Mach等微内核作为操作系统内核,可以通过包装定制它们的外层服务构建出符合POSIX的操作系统接口;
3、系统资源限制
资源包括编译时限制和运行时限制;
编译时限制主要是指基本数据类型的长度限制,例如ISO
C中的INT_MAX等,通过
POSIX定义的限制主要是涉及OS实现的一些常量,共44个。可分为5类:
固定的最小值。如LOGIN_NAME_MAX等;
固定值。SSIZE_MAX;
在运行时可增加的值。如RE_DUP_MAX等;
运行时固定值。如ARG_MAX(最大函数参数长度)等;
路径名不定值。如PATH_MAX等;
XSI的限制
包括了
10 个固定的最小值;
2个数值限制;
3个运行时固定值;
取得运行时限制细节的函数
|
sysconf函数取系统在运行时的资源限制,如_SC_OPEN_MAX(限制一个进程可以打开文件的最大数量)等;
pathconf通过路径名获取对应限制名称name的限制值,fpathconf则通过打开的文件描述符;其中有些限制名称只在某些特殊文件里有定义,如_PC_FILESIZEBITS只能用在目录中。文件限制通常直接跟文件系统的实现相关;
如果name不是标准中定义的常量的话,上述函数将返回-1并置errno为EINVAL (Invalid argument);若为运行时不确定值,则只返回-1,函数调用成功时返回其限制值。
不确定的运行时限制
包括最大路径名字_PC_PATH_MAX与最大打开文件数_PC_OPEN_MAX等。
PATH_MAX在SUS v3之前对是否包括了路径名称末尾的null字符('\0')没有明确定义,为保持兼容性,通常需要考虑此字符作为路径名字的一部分。
在Linux的shell下,若要知道系统当前都有哪些运行时限制,可以使用如下命令:
|
此命令行可打印出当前运行的内核中各种资源限制的名称,可以直接用cat(1)等命令查看其内容。通常可以root权限修改,但一般通过使用命令ulimit(1)修改;
4、POSIX选项
选项说明了系统具体实现的可选功能,包括。如JOB_CONTROL、THREADS、CHOWN_RESTRICTED等。
其值为负数时表示当前系统不支持这些可选功能,为正数时表示支持,为0时可用sysconf、pathconf、fpathconf等函数的返回值确定是否支持;
5、功能测试宏
资源限制通常是与具体的系统实现相关的,为了保证可移植性,应定义功能测试宏强制程序运行时的限制符合标准。
功能测试宏包括了两个常量:_POSIX_C_SOURCE(POSIX标准)与_XOPEN_SOURCE(SUS标准)。如果在C程序源文件中定义了这两个宏,则告诉编译器,资源限制使用POSIX及SUS的定义,而不使用当前系统具体实现中的定义。这两个宏应定义为一个值,如:
|
第一个使得源文件的系统限制遵循POSIX.1标准,第二个为SUS v3标准。也可以不定义在头文件中,而通过编译选项加入宏定义,对于gcc(1)为-D选项。
6、UNIX的基本系统数据类型
包括了size_t、time_t、uid_t、off_t、pthread_t等数据类型,在各个具体的系统实现中通常由C的typedef语句重定义的,其原型可能是某种整型数也可能是个struct结构。使用这些数据类型而不直接用C中的int、long等基本数据类型也是为了考虑程序的可移植性。