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以确定相应的选项是否受到支持。

 

《UNIX环境高级编程》笔记--UNIX标准化及实现的更多相关文章

  1. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...

  2. UNIX环境高级编程笔记 目录

    每一章的重点会使用加粗字体 第一章:UNIX基础知识:UNIX体系结构:文件和目录:输入和输出:程序和进程:出错处理:信号:时间值:系统调用和库函数 第三章:文件I/O:文件描述符:文件操作函数:文件 ...

  3. UNIX环境高级编程笔记之高级I/O

    本章说明了很多高级I/O功能: 非阻塞I/O——发一个I/O操作,不使其阻塞,记录锁,STREAMS机制 I/O多路转接——select和poll函数 readv和writev函数,以及存储映射I/O ...

  4. UNIX环境高级编程笔记之线程

    本章涉及到线程的一些基本知识点,讨论了现有的创建线程和销毁线程的POSIX.1原语,此外,重点介绍了线程同步问题,讨论了三种基本的同步机制:互斥量.读写锁.条件变量.

  5. UNIX环境高级编程笔记之进程控制

    本章重点介绍了进程控制的几个函数:fork.exec族._exit.wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的正常和异常终止.以及怎么让进程执行不同的程序 ...

  6. UNIX环境高级编程笔记之进程环境

    本章讲的都是一些非常基础的知识,目的是为了下一章讲进程控制做铺垫,所以,本章就不做过多的总结了,直接看图吧.

  7. UNIX环境高级编程笔记之标准I/O库

    一.总结 文件I/O一章讲了不带缓冲的I/O,本章讲的是带缓冲的I/O.不带缓冲针对的是内核的系统调用,而带缓冲针对的是用户空间的标准库函数,是基于带缓冲的I/O实现的.不带缓冲的I/O通过文件描述符 ...

  8. 《unix环境高级编程》学习笔记【原创】

    本文基于unix环境高级编程的学习的笔记,写的比较简如有不对,欢迎指点. 简单的描述下面函数的功能改变ctr+c信号原本的作用终止程序,在按下中断键的时候输出一句话. while循环主要读取用户的输入 ...

  9. 《UNIX环境高级编程》(APUE) 笔记系列

    本系列笔记主要是对于 <UNIX环境高级编程>(APUE) 各章节内容 概念性的总结 ,不涉及代码解读 . 目录 : 第一章 UNIX基础知识 第二章 UNIX标准及实现 第三章 文件I/ ...

  10. [置顶] 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

随机推荐

  1. C++/C#结构体转化-传string给C++

    此例是把C#结构传给C++ C++: typedef struct VidyoClientInEventGroupChat_ { /*! Message (contents) to be sent t ...

  2. Javascript闭包概念剖析

    某种情况下,函数调用依然持有对其原始定义的作用域的引用,这个引用就叫做闭包. function foo(){ var a = 2; function bar(){ console.log(a); } ...

  3. java——HashCode和equal方法

    equals()反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. 而hashCode()是对象或变量通过哈希算法计算出的哈希值. 之所以有hashCode方 ...

  4. 第三条:私有化构造器或者枚举类型强化Singleton属性

    1.5版本之前,我们通常实现单例模式有两种方式: 两种方法前提都是私有化构造器,然后通过不同的方式获取对象. 第一种:通过公共的静态变量获取 public class Elivs{ // 私有化构造器 ...

  5. svn添加强制注释,pre-commit结合python

    鉴于组内有些人在提交代码的时候并不写注释,而且没有固定格式,所以准备给svn提交时增加强制注释. 首先找到代码库里的hooks目录,正常建svn库的时候都有这个目录.进入hooks目录,找到pre-c ...

  6. CCNA实验(4) -- EIGRP

    enableconf tno ip do loenable pass ciscoline con 0logg syncexec-t 0 0line vty 0 4pass ciscologg sync ...

  7. CDialogSK - A Skinnable Dialog Class

    Introduction This class is derived from the MFC CDialog. It supports the following features :- If ru ...

  8. 毕业bg(dfs)

    毕业bg Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  9. java 学习 ——计算器小程序

    简易计算器小程序代码: package jisuanqi; //声明须要插入的包 import java.awt.*; import java.lang.Object; import java.lan ...

  10. UIImageView图片视图的基本概念和使用方法

    IOS学习笔记(十)之UIImageView图片视图的基本概念和使用方法(博客地址: http://blog.csdn.net/developer_jiangqq ) Author:hmjiangqq ...