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. WPF之Binding的三种简单写法

    环境 类代码 public class Person:INotifyPropertyChanged { private string name; public string Name { get { ...

  2. Unity StrangeIoc框架 (二)

    MVCSContex :the big picture 1.应用程序的入口是一个类成为ContextView,这是一个Monobehavior实例化MVCSContext 2.用MVCSContext ...

  3. Windows窗口消息大全(转)

    Windows窗口消息大全,全不全自己看 ////////////////////////////////////////////////////////////////////////// #inc ...

  4. 升级python的sqlite库版本

    今天了解了一下用python获取chrome cookie信息,在研究的过程中,发现打开数据库失败,后来调查了一下发现是由于sqlite3库太老的缘故,起码需要3.8以上,然后看了一下python 2 ...

  5. TCP的流量控制

    TCP协议作为一个可靠的面向字节流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现. 要区分TCP的流量控制和拥塞控制: 流量控制是发送方的发送数据的速 ...

  6. iReport 4.1 报表制作,子报表,实例解析

    开发使用步骤(iReport 4.1.1) (个人总结,如有问题请留言,另外知道table控件用法的给我留言或者发邮件谢谢.Email:jiazx0107@163.com) 目录 1.      开发 ...

  7. HBase shell 操作命令记录

    创建表:create 'tablename','column cluseter:column1,column2...columnn','column cluster:column1,column2.. ...

  8. MVC中Filter拦截问题记录之重定向陷阱

    出错环境:被拦截的页面中使用了未实例化的对象,比如只有登录后才有的UserInfor对象. 理想中:浏览器请求页面时,会被Filter拦截,然后重定向到指定页面: 实际现象:将断点打入Filter中, ...

  9. Umbraco隐藏属性

    Umbraco默认的Url地址,是根据Node路径来默认显示的,因此使用中文的话比较尴尬. 网上有传的方法,是修改源码,来实现Url的重写. 但实际大可不必如此麻烦,只需要增加两个类型为Textstr ...

  10. OP(Over-provisioning)预留空间

    SSD上的OP指的是用户不可操作的容量,大小为实际容量减去用户可用容量,OP区域一般被用于优化操作如:WL,GC和坏块映射等.       OP一般分三层(见下图).第一层容量固定为SSD标称容量的7 ...