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使用Log4net.dll库的demo(转载加个人观点)

    原文地址:http://blog.csdn.net/linraise/article/details/50547149 配置文件解析地址:http://blog.csdn.net/pfe_nova/a ...

  2. trangle

    #include<iostream> #include<algorithm> using namespace std; int main() { int a,b,c; whil ...

  3. install tool

    # 查看静态态依赖库 ldd ./nginx #查看安装了哪些模块 ./nginx -V

  4. Java的跨平台原理

    JAVA的跨平台原理 JAVA的跨平台原理 Java是一种简单易用.完全面向对象.有平台无关性.安全可靠的.主要面向Internet的开发工具.Java自从1995年正式面世以来,它的快速发展已经使整 ...

  5. linux杂记(十)what is BASH Shell

    first,what is shell?其实只要是碰过计算机的,对于OS(Operation System操作系统,不管是linux.unix.windows)有点概念的人大多都听过这个名词,因为只要 ...

  6. javaTemplates-学习笔记二

    配置PlayFramework环境 下载jar包[Play with Activator],这一步有点晕是JAVA程序员CMD执行的步骤;运行了jar包下载了很多配置文件什么的,有的资源没有VPN链接 ...

  7. 利用 onload 事件监控跨站资源

    用过 CSP 的都很郁闷,上报的只有违规的站点名,却没有具体路径.这是缺陷,还是特意的设计? 显然,CSP 是为安全定制的,里面的规范自然要严格制定,否则就会带来新的安全问题.如果支持详细路径的上报, ...

  8. java如何引入接口中定义的常量

    接口 (A.java) : package config; public interface A { String PROJECT_ROOT_DIR = System.getProperty(&quo ...

  9. android 布局常用混淆属性

    1.如何控制某一控件在父控件中的相对位置呢? 在Android系统中提供了layout_margin,用来控制某一控件边缘相对于父控件的边距. 其中, android:layout_marginTop ...

  10. Effective C++学习笔记——构造/析构/拷贝运算

    条款9:决不再构造和析构过程中调用virtual函数,包括通过函数间接调用virtual函数. 应用:想在一个继承体系中,一个derived class被创建时,某个调用(例如生成相应的日志log)会 ...