您的位置:首页 > 产品设计 > UI/UE

APUE读书笔记(2.0) ——第二章 Unix 标准化及实现

2013-11-13 10:45 225 查看
第二章 Unix 标准化及实现

一、主要标准
1. 国际 C 语言标准(ISO C):
     • ISO C 是 C 编程语言的标准,适用于一切使用 C 语言编程的场合,目前存在两个版本的国际 C 标准——C89与C99
     • C89:即一般 C 语言教科书中提到的 ANSI C,这是通行的实际标准;

     • C99:主要是在兼容 C89 的基础进行了扩充,例如增加了
               restrict(强制所修饰类型只能为指针的修饰符),
               inline(内联修饰符,以 inline 修饰的函数编译时直接在调用处展开而不进行栈操作)等关键词,
               宽字节(主要应用于 Unicode 场合)头文件<wchar.h>等。

     • C99 共定义了 24 个头文件(见书P20,表2-1)。其中 Linux 的 GNU C 库全部实现,其它的 Unix 平台也不同程度的实现了大部分。
• 内核本身通常没有 C 库函数接口,而是用汇编语言编写

2. 可移植操作系统接口(POSIX,Portable Operating System Interface):

     • POSIX由 IEEE 制定,通过 ISO 进行标准化,目的是标准化各类 Unix 系统接口,以提高它们的应用程序在源代码级上的可移植性;

     • POSIX定义了遵循它的操作系统必需提供的操作系统服务接口(interface),而不是实现(implementation)。因此POSIX不区分系统调用和库函数,而将其统称为函数。

     • POSIX并未专门要求应用程序在二进制机器码层次上的可移植性;

     • 当前通行的标准为 POSIX.1,另有 POSIX.1b(POSIX 线程扩展)和 POSIX.1c(实时扩展)。

     • POSIX.1包括ISO C标准库函数,因此POSIX.1还包括26 个头文件,26 个扩展头文件,8 个可选头文件;(见书P22,表2-2 ~ 表2-4)

     • POSIX.1本身没有专门定义超级用户的概念,但对一些操作要求区分操作权限;

3. 单一 Unix 规范(SUS,Single UNIX Specification)与 X/Open 系统接口(XSI,X/Open System Interface):

     • 由 UNIX®商标的拥有者 Open Group 发布,是 POSIX.1 的一个扩展超集,Open Group 的前身即为 X/Open;

     • SUS 系统接口全集被称为 XSI;

     • 只有遵循XSI的实现才能被称为UNIX系统;

4. 文件系统层次标准(FHS,Filesystem Hierarchy Standard)Linux 标准基础(LSB,Linux Standard Base):

     • 这两个标准主要由自由标准组织 FSG(Free Software Group)制定和维护的,APUE 书中没有提及,但在实际开发 Unix 应用程序时,还是有参考价值;

     • FHS 定义了 Unix­like 的操作系统中文件系统结构组织的规范,例如各类配置文件、应用程序、应用程序资源文件及数据文件等应该放在什么目录下等等;这里有一篇介绍文章(http://tech.sina.com.cn/s/2008-03-04/08122055472.shtml)。

     • LSB 是为缩小 Linux 内核下不同发行版之间的差异并进行某种统一而制定的标准,包括了:致力于应用程序在机器码级别上的兼容性、确定诸如 GTK、OpenGL、Fontconfig 等库的接口规范等多个方面,它本身集成了 FHS 标准;这里有一篇介绍文章(http://www.ibm.com/developerworks/cn/linux/l-lsb-intr/index.html)。

5. 还有其它一些标准在 Unix 系统编程中可能也会遇上,如 TCP/IP 协议、Sun RPC、RFC、i18n 等。

二、系统资源限制
1. 资源包括编译时限制和运行时限制;

2. 编译时限制
     • 主要是指基本数据类型的长度限制,一般在头文件中限制,例如 ISO C 中的 INT_MAX 等,通过limits.h(7)来引用;

3. 运行时限制
     • 例如文件名的字符串长度,要求调用函数以获得这种限制值;

4. IOS C限制

     • 都是编译时限制,具体见书P30,表2-6;

5. POSIX 定义的限制主要是涉及 OS 实现的一些常量,共 44 个。可分为 5 类:

     • 不变的最小值,不随系统而改变,一个符合POSIX.1的实现应当提供比该值更大的值(具体见书P31,表2-8);

          • 严格遵循POSIX:不依赖于POSIX未定义的行为,不使用已废弃的接口,不要求常量值大于不变最小值。

     • 由于不变的最小值太小,因此它有一个相关的实现值,该实现值属于下面四种

          • 不变值。SSIZE_MAX;

          • 在运行时可增加的值。如 RE_DUP_MAX 等;

          • 运行时不变值。如 ARG_MAX(最大函数参数长度)等;

           • 路径名可变值。如 PATH_MAX 等;

     • 在<limits.h>或者通过sysconf,pathconf和fpathconf来获取这些值,但是也有一些是“可能不确定”(逻辑上无限),即没有实际上限;

6. XSI 的限制

在POSIX的基础上,还定义了:

     • 10个不变最小值(P32,表2-9);

     • 2个数值限制,LONG_BIT与WORD_BIT;

     • 3个运行时不变值ATEXIT_MAX、IOV_MAX、PAGE_SIZE;

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

     • 在<unistd.h>中定义
long sysconf(int name);
//取系统在运行时的资源限制,如_SC_OPEN_MAX(限制一个进程可以打开文件的最大数量)等;(name的取值见书P33,表2-10)

long pathconf(const char *pathname, int name);
//通过路径名获取对应限制名称 name 的限制值;(name的取值见书P34,表2-11)

long fpathconf(int filedes, int name);
//通过打开的文件描述符获取对应限制名称 name 的限制值,其中有些限制名称只在某些特殊文件里有定义,如_PC_FILESIZEBITS 只能用在目录中。文件限制通常直接跟文件系统的实现相关;(name的取值见书P34,表2-11)



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

     • pathconf的参数pathname与fpathconf的参数filedes有特殊限制,不满足时返回结果位置,具体见书P34

8.不确定的运行时限制

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

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

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

     $ find /proc/sys ­name *max*

     • 此命令行可打印出当前运行的内核中各种资源限制的名称,可以直接用 cat(1)等命令查看其内容。通常可以 root 权限修改,但一般通过使用命令 ulimit(1)修改;

三、POSIX 选项

     • 选项说明了系统具体实现的可选功能。如 JOB_CONTROL, THREADS, CHOWN_RESTRICTED 等。

     • 其值为负数时表示当前系统不支持这些可选功能,为正数时表示支持,为 0 时可用 sysconf, pathconf, fpathconf 等函数的返回值确定是否支持;

四、功能测试宏

     • 资源限制通常是与具体的系统实现相关的,为了保证可移植性,应定义功能测试宏强制程序运行时的限制符合标准。

     • 功能测试宏包括了两个常量:_POSIX_C_SOURCE(POSIX 标准)与_XOPEN_SOURCE(SUS 标准)。

     • 如果在 C 程序源文件中定义了这两个宏,则告诉编译器,资源限制使用 POSIX 及 SUS 的定义,而不使用当前系统具体实现中的定义。这两个宏应定义为一个值,如:
#define _POSIX_C_SOURCE 200112L     //令源文件的系统限制遵循 POSIX.1 标准
#define _XOPEN_SOURCE 600     //令源文件的系统限制遵循 SUS v3 标准
          也可以不定义在头文件中,而通过编译选项加入宏定义,对于 gcc(1)为­D 选项。

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

     • 包括了 size_t、time_t、uid_t、off_t、pthread_t 等数据类型,它们是不透明的数据类型。在各个具体的系统实现中通常由 C 的 typedef 语句重定义的,其原型可能是某种整型数也可能是个 struct 结构或者其它。使用这些数据类型时,为了考虑程序的可移植性,不应直接使用其对应的 C 基本数据类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息