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. 最小生成树Jungle Roads

    这道题一定要注意录入方式,我用的解法是prime算法 因为单个字符的录入会涉及到缓冲区遗留的空格问题,我原本是采用c语言的输入方法录入数据的,结果对了,但是提交却一直wrong,后来改成了c++的ci ...

  2. realloc,c语言

    realloc #include <stdlib.h> main() { char* ptr=NULL; char* ptr2=NULL; ptr = malloc(); printf(& ...

  3. SimpleXML 使用详细例子

    要处理XML 文件,有两种传统的处理思路:SAX 和DOM.SAX 基于事件触发机制, 对XML 文件进行一次扫描,完成要进行的处理:DOM 则将整个XML 文件构造为一棵DOM 树,通过对DOM 树 ...

  4. linux杂记(五)正确关机方法(shutdown,reboot,init,halt)

    前言:由于在linux底下,每个程序(或者说是服务)都是在背景下运行的,因此,在你看不到的屏幕背后其实可能有相当多人同时在你的主机上面工作,如果 你直接按下电源开关来关机,则可能导致其他人的数据就此中 ...

  5. (iOS)Storyboard/xib小技巧

    1.选择被view覆盖住的view 当你想直接在view中选择自己想要的元素时,但是又碍于一个view上叠加的元素太多很难直接选中,那么在这时,你同时按住键盘上的shift和 control键,然后在 ...

  6. 了解常见的浏览器内核 Trident,Geckos,Presto,Webkit

    了解常见的浏览器内核 Trident,Geckos,Presto,Webkit 内核只是一个通俗的说法,英文名称为"Layout engine",翻译过来就是"排版引擎& ...

  7. WL(Wear leveling)磨损平衡

    前面说过,闪存寿命是以P/E次数来计算的,而WL就是确保闪存内每个块被写入的次数相等的一种机制.若没有这个机制,SSD内的闪存颗粒就无法在同一时间内挂掉,那对用户来说就是灾难.       会出现这种 ...

  8. Kate Spade_百度百科

    Kate Spade_百度百科 Kate Spade

  9. mysql的索引问题

    注意:索引一般适合用于经常查询的数据,可以提高查询效率:但是不适合用于经常用到增.删.改的数据:会影响效率低. 1.unique key->(唯一索引)在一张表里可以有多个,起到约束的作用:避免 ...

  10. 解决android加载图片时内存溢出问题

    尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过jav ...