CSDN 上的 APUE 读书笔记第二章 -- Unix 标准化及实现

20 篇文章 0 订阅

1、主要标准

  A. 国际 C 语言标准(ISO C):

  •  ISO C 是 C 编程语言的标准,适用于一切使用 C 语言编程的场合;  
  • 目前存在两个版本的国际 C 标准,一个是 C89,即一般 C 语言教科书中提到的 ANSI C,这是通行的实际标准;  
  • 另一个是 C99,主要是在兼容 C89 的基础进行了扩充,例如增加了 restrict(强制所修饰类型只能为指针的修饰符)、inline(内联修饰符,以inline 修饰的函数编译时直接在调用处展开而不进行栈操作)等关键词,增加了宽字节(主要应用于Unicode 场合)头文件<wchar.h>等。  
  • C99 共定义了 24 个头文件。其中 Linux 的 GNU C 库全部实现,其它的 Unix 平台也不同程度的实现了大部分。 
  •  内核本身通常没有 C 库函数接口,如 Linux 的内核;
B. 可移植操作系统接口(POSIX,Portable Operating System Interface):
 
  • POSIX 由 IEEE 制定,通过 ISO 进行标准化;  
  • 这个名称是 RMS 建议起的;  
  • 颁发 POSIX 的目的是标准化各类 Unix 系统接口,以提高它们的应用程序在源代码级上的可移植性;  
  • POSIX 定义了遵循它的操作系统必需提供的操作系统服务接口。  
  • POSIX 不指出哪些接口是系统调用,哪些是库函数。而将其交由遵循此标准的系统去自由实现; 
  •  POSIX 并未专门要求应用程序在二进制机器码层次上的可移植性;  
  • 当前通行的标准为 POSIX.1,另有 POSIX.1b(POSIX 线程扩展)和 POSIX.1c(实时扩展)。  
  • ISO C 标准库函数被定义为 POSIX.1 的一个子集,另外还包括了 26 个头文件,26 个扩展头文件,8 个可选头文件;  
  • POSIX.1 本身没有专门定义超级用户的概念,但对一些操作要求区分操作权限;
C. 单一 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 和实用程序以及基本理论;
D. 文件系统层次标准(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。

E. 还有其它一些标准在 Unix 系统编程中可能也会遇上,如 TCP/IP 协议、Sun RPC、RFC、i18n 等,APUE 中未对此专门描述,这里略。


2、主要 Unix 系统实现简介

A. Unix 简史:
  •  这部分 APUE 上没有细述,ESR 的 TAOUP(The Art Of UNIX Programming,《UNIX 编程艺术》)一书中有比较详细的介绍,这里作为行业文化与传统的知识背景稍微补充扩展一下。www.unix.org 上有一个通过时间线介绍的简史,或者可以通过 google timeline 看 Unix 更详细的编年史;
  • 第一个 UNIX 诞生于 1969 年的贝尔实验室,作者是 Ken Thompson 和 Dennis Ritchie。1971年开始投入实际应用,1973 年用C语言改写,开始在各类平台的计算机上进行移植;
  • 以后的 UNIX 分支主要来源于 1976 年的 UNIX v6 和 1979 年的 UNIX v7。这里有一张 Unix 家族树图。分支最终导致了标准的诞生。
  • 最重要的两个分支为:AT&T 的 System V,其最终版本为 SVR4(System V Release 4),发布于 1989 年、加州大学伯克利分校的 BSD(Berkeley Software Distribution),其最终版本为4.4BSD,发布于1994年。目前互联网上都提供了这两个版本的源代码自由下载;
  • POSIX 主要是在 System V 分支的基础上制定,同时引进了套接字等在 BSD 分支上比较领先的领域;
  • 历史上,一般“UNIX 机器”名称的涵义包括了包括操作系统实用工具与外围磁带设备等在内的整套计算机软硬件;
  • RMS 于 1983 年创建了 GNU 项目;并于 1985 年,成立了自由软件基金会 FSF 并发表了 GNU宣言;在1989 年发表了GPL 许可证第一版;从此,自由软件运动贯穿和深刻影响了以后的Unix 史;
  • ESR于 1997 年发表了评论文章《大教堂与市集》,这篇文章成为开源软件运动的重要旗帜文章,从 Unix 领域开始并往外推广,影响并几乎重新洗牌了整个软件业界的开发模式;
B. Linux
  • Linux 是在 POSIX 标准指导下发布的独立 Unix 分支,使用 GPL 许可证;
  • Linux 由 Linus Torvalds 于 1991 年首次发布,并由其维护至今;
  • Linux 商标由 Linus Torvalds 本人持有,但 Linux 本身不拥有 UNIX 商标;
  • Linux 到目前为止的最新版本为 2.6.27,可以在 www.kernel.org 自由下载其完整源代码;
  • 由于其自由开放的开发模式,Linux 受到了世界各地程序员的欢迎和自发贡献和测试源码,并移植到了各种计算机体系结构上。目前已经广泛应用于包括从超级计算机到家用电脑到嵌入式设备的各个领域;
C. FreeBSD
  • FreeBSD 项目开始于经典的 BSD 项目停止后的 1994 年,为 4.4BSD-Lite 的直系后裔;
  • FreeBSD 项目最早基于 Intel 80386 下开发,今天也已经移植到了多种体系结构上;
  • FreeBSD 项目由“FreeBSD Project”组织维护,使用 BSD 许可证;
  • FreeBSD 操作系统主要应用于服务器领域,以成熟稳定、高可靠性著称;
  • 最新版本为 FreeBSD 7,并计划于 2009 年第二季度发布 FreeBSD 8;

D. 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;
E. Solaris

  • Solaris 的前身 Sun OS 最早在 BSD 的基础上开发,但自 Sun OS 5 开始改为 SVR4。为 SUN 微系统公司的产品;
  • Solaris 主要运行在 SUN 公司的 SPARC 体系结构上,但现在也开始支持 x86;
  • 从 Solaris 10 开始,该系统通过 OpenSolaris 项目以开源产品的形式发布,但本质上仍属于私有软件而不是自由软件;
  • Solaris 是一个企业级的 UNIX 操作系统,有多年的商业成功案例,广泛应用于商业中小型机;
F. 其它 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、系统资源限制

A. 资源包括编译时限制和运行时限制;
B. 编译时限制主要是指基本数据类型的长度限制,例如 ISO C 中的 INT_MAX 等,通过limits.h(7)来引用;
C. POSIX 定义的限制主要是涉及 OS 实现的一些常量,共 44 个。可分为 5 类:  
  • 固定的最小值。如 LOGIN_NAME_MAX 等;  
  • 固定值。SSIZE_MAX;  
  • 在运行时可增加的值。如 RE_DUP_MAX 等;  
  • 运行时固定值。如 ARG_MAX(最大函数参数长度)等;  
  • 路径名不定值。如 PATH_MAX 等;

D. XSI 的限制

包括了 

  •  10 个固定的最小值;
  •   2 个数值限制; 
  •  3 个运行时固定值;

E. 取得运行时限制细节的函数

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

sysconf 函数取系统在运行时的资源限制,如_SC_OPEN_MAX(限制一个进程可以打开文件的最大数量)等;

pathconf 通过路径名获取对应限制名称 name 的限制值,fpathconf 则通过打开的文件描述符;其中有些限制名称只在某些特殊文件里有定义,如_PC_FILESIZEBITS 只能用在目录中。文件限制通常直接跟文件系统的实现相关;

如果name 不是标准中定义的常量的话,上述函数将返回-1并置errno 为EINVAL (Invalid argument);若为运行时不确定值,则只返回-1,函数调用成功时返回其限制值。


F. 不确定的运行时限制

包括最大路径名字_PC_PATH_MAX与最大打开文件数_PC_OPEN_MAX等。

PATH_MAX 在 SUS v3 之前对是否包括了路径名称末尾的 null 字符('\0')没有明确定义,为保持兼容性,通常需要考虑此字符作为路径名字的一部分。

G. 在 Linux 的 shell 下,若要知道系统当前都有哪些运行时限制,可以使用如下命令:

$ find /proc/sys -name *max*

此命令行可打印出当前运行的内核中各种资源限制的名称,可以直接用 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的定义,而不使用当前系统具体实现中的定义。这两个宏应定义为一个值,如:

#define _POSIX_C_SOURCE 200112L
#define _XOPEN_SOURCE 600

第一个使得源文件的系统限制遵循 POSIX.1 标准,第二个为 SUS v3 标准。也可以不定义在头文件中,而通过编译选项加入宏定义,对于 gcc(1)为-D选项。


6、Unix 的基本系统数据类型


包括了size_t、time_t、uid_t、off_t、pthread_t等数据类型,它们是不透明的数据类型。在各个具体的系统实现中通常由C 的typedef 语句重定义的,其原型可能是某种整型数也可能是个struct结构或者其它。使用这些数据类型时,为了考虑程序的可移植性,不应直接使用其对应的 C 基本数据类型。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值