在过去的将近25年时间,人们为了UNIX的标准化做出了种种努力,这使得程序在不同版本的UNIX系统之间的移植相当容易。

ISO C

1989年,C语言首个标准得到批准,其为C89。次年,一个带有小改动的版本标准被批准其为C90。因此,C89和C90通常指同一种语言。在2000年三月,ANSI采纳了ISO/IEC 9899:1999标准。这个标准通常指C99。在2011年12月,ANSI采纳了ISO/IEC 9899:2011标准。这个标准通常即C11,它是C程序语言的现行标准。

按照ISO C标准定义的头文件将C语言公用函数库划分成了24个部分。POSIX.1标准包括这些头文件以及一些额外的头文件。

IEEE POSIX

POSIX是由IEEE制订的一系列标准,其指的是可移植操作系统接口,它说明的是接口而不是实现。

Single UNIX Specification

Single UNIX Specification简称SUS,它是POSIX.1标准的一个超集。

UNIX系统实现

ISO C、IEEE POSIX、Single UNIX Specification是三个不同的组织,第一个组织负责对C语言进行标准化,后两个组织负责对UNIX系统接口进行标准化。这三个组织制定了概念上的规范,但实现是由厂商进行的。几个知名实现发行版如下:

  • SVR4:AT&T实现
  • BSD:加州大学伯克利分校实现
  • FreeBSD:FreeBSD志愿者
  • Linux:Minix改写而来,志愿者维护
  • Mac OS X:Apple公司
  • Solaris:SUN公司

UNIX系统中既有编译器的限制,又有UNIX实现(与编译程序无关)有关的限制。这两种限制有交集部分,也有差集部分,比如int类型的字节长度,和编译器有关,和UNIX系统无关,但通常编译器会参考操作系统的实现来决定。而程序能打开文件描述符的数量和UNIX实现有关,而和编译器无关。对于操作系统的种种限制,UNIX系统提供了3个库函数来查看。其头文件及函数原型如下:

#include <unistd.h>

long int sysconf (int name);
long int pathconf (const char* path, int name);
long int fpathconf (int fd, int name);

对于上述3个函数,成功时返回相应值,失败则返回-1。对于pathconf( )、fpathconf( )函数来说,第一个参数并不是总是有意义的,当需要查询一个文件的链接数时,第一个参数总是需要的,当查询系统的文件名长度限制时,第一个参数是无意义的,只要不为空即可。

上图的宏为sysconf( )函数的,不能在pathconf( )、fpathconf( )函数中使用。

下图的宏为pathconf( )、fpathconf( )函数的,不能在sysconf( )函数中使用。

需要说明的是,sysconf( )函数和pathconf( )、fpathconf( )函数的参数是不一样的,虽然它们的参数都是一些宏,但不能混用。正是由于参数是使用宏实现的,其宏的值可能会重合,导致三个函数之间的部分宏混用时部分能成功,从而导致误以为宏是通用的。例如在fpathconf( )函数中使用 _SC_SEM_NSEMS_MAX 宏就会出错,但在sysconf( )函数中使用 _PC_NAME_MAX 宏却正常,这可能是因为宏查找替换之后,宏的实际值碰巧吻合有效。

UNIX环境高级编程 第2章 UNIX标准及实现的更多相关文章

  1. UNIX环境高级编程 第1章 UNIX基础知识

    所有操作系统都为运行在它之上的程序提供各种服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储空间.提供时间等. UNIX体系结构 严格来说,操作系统是一种软件,它控制计算机硬件资源,提供程 ...

  2. UNIX环境高级编程 第5章 标准I/O库

    本章是关于C语言标准I/O库的,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系.由于UNIX系统存在很多实现,而每个实现都有自己的标准I/O库,为了统一 ...

  3. UNIX环境高级编程 第8章 进程控制

    本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...

  4. UNIX环境高级编程 第7章 进程环境

    本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...

  5. UNIX环境高级编程 第13章 守护进程

    守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...

  6. UNIX环境高级编程 第9章 进程关系

    在第8章学习了进程的控制原语,通过各种进程原语可以对进程进行控制,包括新建进程.执行新程序.终止进程等.在使用fork( )产生新进程后,就出现了进程父子进程的概念,这是进程间的关系.本章更加详细地说 ...

  7. UNIX环境高级编程 第6章 系统数据文件和信息

    UNIX系统的正常运作需要用到大量与系统有关的数据文件,例如系统用户账号.用户密码.用户组等文件.出于历史原因,这些数据文件都是ASCII文本文件,并且使用标准I/O库函数来读取. 口令文件 /etc ...

  8. UNIX环境高级编程 第16章 网络IPC:套接字

    上一章(15章)中介绍了UNIX系统所提供的多种经典进程间通信机制(IPC):管道PIPE.命名管道FIFO.消息队列Message Queue.信号量Semaphore.共享内存Shared Mem ...

  9. UNIX环境高级编程 第14章 高级I/O

    这一章涉及很多概念和函数,包括:非阻塞I/O.记录锁.I/O复用.异步I/O.readv和writev函数以及内存映射. 非阻塞I/O 在Unix中,可以将系统调用分为两种,一种是“低速”系统调用,另 ...

随机推荐

  1. (暂时弃坑)ACM数论之旅15---置换群与Polya定理(我把标题看成poi了,poipoipoi(*≧▽≦)ツ)

    (挖坑...) ////////////////////////////////////////////////// 暂时弃坑 开学了,有空再写....

  2. Spring4+Spring MVC+MyBatis整合思路

    1.Spring框架的搭建 这个很简单,只需要web容器中注册org.springframework.web.context.ContextLoaderListener,并指定spring加载配置文件 ...

  3. 学习Spring Boot:(七)集成Mybatis

    前面都是用的是spring data JPA,现在学习下Mybatis,而且现在Mybatis也像JPA那样支持注解形式了,也非常方便,学习一下. 数据库 mysql 5.7 添加依赖 在pom文件中 ...

  4. THUWC2017随机二分图

    题面链接 洛谷 sol 唯一的重点是拆边... 0的不管,只看1.2. 先无论如何把两条边的边权赋为\(0.5\)然后我们发现如果两个都选了. 对于第一种边,我们发现如果\(\frac{1}{2} * ...

  5. [UVALive 3683] A Scheduling Problem

    图片加载可能有点慢,请跳过题面先看题解,谢谢 题目给出了一个信息:答案是有向边最长路 \(k\) 的值或者是 \(k+1\) 的值 那么题目就变成了:求是否有一种给无向边定向的方案,使得在以有向边最长 ...

  6. 在OpenShift上托管web.py应用

    一.背景 最近在学习web.py,跟随官网的cookbook和code examples一路敲敲打打,在本地访问了无数遍http://0.0.0.0:8080/,也算是对web.py有了基本的认识.为 ...

  7. 【bzoj3881】【Coci2015】Divljak

    题解 对$S$集合ac建自动机,把$T_{i}$放在里面跑,记录路径上的所有节点并对它们在fail树上求到root的树链并: 这样就得到了$T_{i}$所有的子串: 动态将$T_{i}$加入直接用树状 ...

  8. Dubbo、Zookeeper集群搭建及Rose使用心得(二)

    上篇讲了一下配置,这次主要写一下这个框架开发的大概流程.这里以实现 登陆 功能为例. 一.准备工作 1.访问拦截器 用户在进行网站访问的时候,有可能访问到不存在的网页,所以,我们需要把这些链接重新定向 ...

  9. increment/decrement/dereference

    #include <vector> #include <deque> #include <algorithm> #include <iostream> ...

  10. redis 新开端口号

    2012 ps aux | grep redis 2013 cd /usr/local/redis/ 2014 ls 2015 cd etc/ 2016 ls 2017 cp redis.conf r ...