UNIX环境高级编程读书笔记(2)

来源:互联网 发布:网络摄像机ip搜索软件 编辑:程序博客网 时间:2024/05/16 17:42

UNIX环境高级编程第二章 读书笔记

一、UNIX标准化

1.ISO C

ISO C标准现在由ISO/IEC的C程序设计语言国际标准工作组维护和开发该工作组称为ISO/IEC JTC1/SC22/WG14简称WG14ISO C标准意图提供C程序的可移植性,使其能适合于大量不同的操作系统,而不只适合UNIX系统。此标准不仅定义了C程序设计语言的语法和语义还定义了其标准库

ISO C标准定义的头文件
这里写图片描述

2.IEEE POSIX

POSIX是一个最初由IEEE订制的标准族。POSIX指的是可移植操作系统接口。

POSIX标准定义的必须的头文件
这里写图片描述

POSIX标准定义的XSI可选头文件
这里写图片描述

3.Single UNIX Specification

Single UNIX SpecificationPOSIX.1标准的一个超集,它定义了一些附加接口扩展了POSIX.1规范提供的功能。POSIX.1相当于Single UNIX Specification中的基本规范部分
POSIX.1中的X/Open系统接口选项描述了可选的接口,也定义了遵循XSI的实现必须支持POSIX.1的哪些可选部分。这些必须支持的部分包括:文件同步、线程栈地址和长度属性、线程进程共享同步以及_XOPEN_UNIX符号常量
有些接口在遵循XSI的系统中是可选的,这些接口根据功能被分为若干选线组,具体如下:
加密:由符号常量_XOPEN_CRYPE标记
实时:由符号常量_XOPEN_REALTIME标记
高级实时
实时进程:由符号常量_XOPEN_REALTIME_THREADS标记
高级实时线程

POSIX标准定义的可选头文件
这里写图片描述

POSIX.1可选接口组和选址吗
这里写图片描述

4.FIPS

FIPS代表的是联邦信息处理标准。(现在已经被撤回)
FIPS作用是:要求任何希望向美国政府销售符合POSIX.1标准的计算机系统厂商都应支持POSIX.1的某些可选功能

二、限制

UNIX系统实现定义了许多幻数常量,其中由很多已经被硬编码编码到程序中,或用特定的技术确定。由于大量标准化工作的努力,已有若干种可移植的方法用以确定这些幻数和具体实现定义的限制。这非常有利于改善*UNIX环境下软件的可移植性*。

以下两种类型的限制必须的。
(1)编译时限制(2)运行时限制
编译时限制可在头文件中定义,程序在编译时可以包含这些头文件
运行时限制要求进程调用一个函数获得限制值

由于大多数UNIX系统支持多文件系统类型,而每一种类型都有它的限制。文件名的最大长度依赖于该文件处于何种文件系统,为了解决这类问题,提供了3种限制
(1)编译时限制(头文件)(2)与文件或目录无关的运行时限制(sysconf函数)
(3)与文件或目录有关的运行时限制(pathconf和fpathconf函数)

ISO C限制

ISO C定义的所有编译时限制都列在头文件 < limits.h > 中。这些限制常量给定系统不会改变
< limits.h >中定义的整形值大小
这里写图片描述

ISO C在< stdio.h >中存在另外的ISO C常量——FOPEN_MAXTMP_MAXFILENAME_MAX
FOPEN_MAX:具体实现保证可同时打开的标准I/O流的最小个数。
TMP_MAX:由tmpnam函数产生唯一文件名的最大个数。
FILENAME_MAX:文件名的最大长度。

FILENAME_MAX,FOPEN_MAX和TMP_MAX值在4个平台的值
这里写图片描述

POSIX限制

POSIX.1接口有关的限制和常量分为下列7类
数值限制:LONG_BIT、SSIZE_MAX和WORD_BIT
最小值:图2.8中的25个常量
最大值:_POSIX_CLOCKRES_MIN
运行时可以增加的值:CHARCLASS_NAME_MAX、COLL_WEIGHTS_MAX、LINE_MAX、NGROUPS_MAX和DUP_MAX
运行时不变值:图2.9中的17个常量
其他不变值:NL_ARGMAX、NL_MSGMAX、NL_SETMAX和NL_TEXTMAX
路径名可变值:FILESIZEBITS、LINK_MAX、MAX_CANON、MAX_INPUT、MAX_INPUT、NAME_MAX、PATH_MAX、PIPE_BUF和SYMLINK_MAX

< limits.h >中的POSIX.1最小值
这里写图片描述

< limits.h >中的POSIX.1运行时不变值
这里写图片描述

XSI限制

XSI定义了代表实现限制几个常量
(1)最小值:图2-10中列出的5个常量。
(2)运行时不变值:IOV_MAX和PAGE_SIZE

< limits.h >中的XSI最小值
这里写图片描述

函数sysconf、pathconf和fpathconf

运行时限制可调用下面3个函数之一获得:

#include < unistd.h >
long sysconf(int name)
long pathconf(const char *pathname , int name)
long fpathconf(int fd , int name)
所有函数的返回值:若成功,返回相应值,若出错,返回-1

pathconf函数fpathconf函数的差别pathconf函数是用路径名作为其参数,而fpathconf函数使用文件描述符作为其参数。
sysconf函数所使用的name参数,用于标识系统限制。以 _SC_ 开始的常量用作标识运行时限制的sysconf参数。以_PC_开始的常量用作标识运行的限制的pathconf或fpathconf参数

3个函数不同的返回值
(1)如果name参数并不是一个合适的常量,这3个函数返回-1,并将errno置为EINVAL
(2)有些name返回一个变量值(返回值>=0)或者提示该值时不确定的不确定的值通过返回-1来体现,而0不改变errno的值。
(3)_SC_CLK_TCK的返回值是每秒的时钟滴答声,用于times函数的返回值

对于pathconf的参数pathnamefpathconf的参数fd许多限制。如果不满足其中任何一个限制,则结果是未定义的。
(1)__PC_MAX_CANON __PC_MAX_INPUT引用的文件是终端文件
(2)__PC_LINK_MAX __PC_TIMESTAMP_RESOLUTION引用的文件可以是文件或目录。如果是目录,则返回值用于目录本身,而不用于目录内的文件名项
(3)__PC_FILESIZEBITS__PC_NAME_MAX引用的文件必须时目录,返回值用于该目录中的文件名
(4)__PC_PATH_MAX引用的文件必须是目录。当所指定的目录工作目录时,返回值时相对路径名的最大长度
(5)__PC_PIPE_BUF引用的文件必须时管道FIFO目录。在管道或FIFO情况下,返回值是所引用的管道或者FIFO的限制值。对于目录返回值是对在该目录中创建任一FIFO的限制值
(6)__PC_SYMLINE_MAX引用的文件必须时目录返回值是该目录中符号链接包含字符串最大长度

对sysconf的限制及name参数
这里写图片描述

对pathconf和fpathconf的限制及name参数
这里写图片描述

不确定的运行时限制

1.路径名
许多程序需要为路径名分配存储区,一般来说,在编译时就为其分配了存储区,而且不同的程序使用各种不同的幻数作为数组长度

2.最大打开文件数
守护进程中一个常见的代码序列关闭所有打开文件。在< sys/param.h >存在常量NOFILE用来代表最大打开文件数,在< stdio.h >也存在作为打开文件上限的常量_NFILE
支持Single UNIX SpecificationXSI扩展的系统提供给了getrlimit(2)函数。它返回一个进程可以同时打开的描述符的最多个数。我们通过该函数检测出对于进程能够打开的文件数其实没有上限

三、选项

如果我们编写可移植的应用程序,而这些应用程序可能会依赖于这些可选的支持的功能,那么就需要一种可移植的方法判断实现是否支持一个给定的选项

POSIX.1定义了3种处理选项的方法。
(1)编译时选项定义在< unistd.h >中。
(2)与文件或目录无关的运行时选项用sysconf函数来判断。
(3)与文件或目录有关的运行时选项通过调用pathcof或者fpathconf来判断。

如果符号常量未定义,则必须使用sysconfpathconffpathconf判断是否支持该选项。在这种情况下,这些函数的name参数前缀_POSIX必须替换成_SC_PC。对于以_XOPEN前缀的常量,在构成name前必须在其前放置_SC_PC

对于每一个选项,有以下3种可能的平台支持状态。
(1)如果符号常量没有定义或定义值为-1,那么该平台在编译时并不支持相应选项。但是有一种可能,即在已支持该选项的新系统上运行老的应用时,即使该选项在应用编译时未被支持,但如今新系统运行时检查会显示该选项已被支持。
(2)如果符号常量的定义值大于0,那么该平台支持相应选项。
(3)如果符合常量的定义值为0,那必须调用sysconf、pathconf或fpathconf来判断相应选项是否受到支持。

pathconf和fpathconf的选项及name参数
这里写图片描述

sysconf的选项及name参数
这里写图片描述

四、功能测试宏

如果在编译一个程序时,希望它只与POSIX的定义相关,而不与任何实现定义的常量冲突,那么就需要定义常量__POSIX_C_SOURCE。一旦定义了_POSIX_C_SOURCE,所有POSIX.1头文件都使用此常量来排除任何实现专有的定义

常量__POSIX_C_SOURCE及__XOPEN_SOURCE被称为功能测试宏。所有功能测试宏都以下划线开始。当要使用它们时,通常在cc命令行中以下列方式定义
cc -D_POSIX_C_SOURCE=200809L file.c
这样定义使得C程序在包括任何头文件之前定义了测试宏。如果我们仅想使用POSIX.1定义,那么可将源文件的第一行设置为
#define_POSIX_C_SOURCE 200809L

五、基本系统数据类型

头文件< sys/type.h >中定义了某些与实现有关的数据类型,他们被称为基本系统数据类型

一些常用的基本系统数据类型
这里写图片描述