《UNIX环境高级编程》 之 2-UNIX标准

蒸汽
蒸汽
发布于 2025-03-10 / 10 阅读
0
0

《UNIX环境高级编程》 之 2-UNIX标准

2.2 UNIX标准化

2.2.1 ISO C

目标:实现C程序的可移植性,使其能够适合于大量不同的操作系统 内容:定义了C程序设计语言的语法和予以,还定义了其标准库,现今所有的UNIX操作系统都提供该C标准库 工作组: ISO/IEC JTC1/SC22/WG14 ,简称WG14 定义的头文件: image.png

2.2.2 IEEE POSIX

POSIX:Portable Operating System Interface, 可移植性操作系统接口

国际标准版本 : ISO/IEC 9945-1:1990, 即POSIX.1, 1996年发布多线程编程接口版本

目的:提升应用程序在各种UNIX系统环境之间的可移植性。 内容:定义了符合POSIX操作系统必须提供的各种服务 定义的头文件:(必须与可选) image.png

image.png image.png 选项码:能够表述标准的2-3个字母的缩写,用以标识属于各个功能分区的接口 tips:POSIX.1 没有包括超级用户(superuser)的概念,代之以某些操作要求适当的优先级,这一含义交由具体实现进行解释

2.2.3 Single UNIX Specification

SUS,单一UNIX规范,拓展了POSIX.1的功能

XSI,X/Open 系统接口(X/Open system interface),一个系统只有遵循了XSI的实现给出了对应的接口才能称为UNIX系统 XSI分组:

  • 加密,由符号常量_XOPEN_CRYPE标记

  • 实时,由符号常量_XOPEN_REALTIME标记

  • 高级实时

  • 实时线程:由符号常量_XOPEN_REALTIME_THREADS

  • 高级实时线程

2.2.4 FIPS

目前已撤回

联邦信息处理标准(Federal Information Processing Standard),美国政府发布,由美国政府用于计算机采购

作用:它要求希望向美国政府销售符合POSIX.1标准的计算机系统的厂商都应支持POSIX.1的某些可选功能

2.3 UNIX系统实现

UNIX系统家族树历史

  • UNIX的各种版本和辩题都起源于PDP-11系统上运行的UNIX分时操作系统第6版和第7版(非贝尔实验室版本)

  • 基于上述系统演化的分支:

    • AT&T

    • 加州大学伯克利分校,引出4.xBSD

    • AT&T和贝尔实验室开发UNIX分时系统V8,V9,终止于V10

2.3.1 SVR4

AT&T的产品 SVR4:UNIX System V Release 4 SVID:系统V接口定义

2.3.2 4.4BSD

BSD:伯克利软件发布版 最初的BSD系统包含了AT&T专有源代码,需要AT&T许可证。近几年这种情况正在改变,越来越多AT&T源代码被替换成非AT&T源代码

2.3.3 FreeBSD

FreeBSD基于 4.4BSD-Lite,加州大学伯克利分校的CSRG决定终止UNIX的BSD研发后,为了继续坚持BSD系列,形成了FreeBSD项目。 全开源免费

2.3.4 Linux

Linux是一种提供类似于UNIX的丰富编程环境的操作系统,在GNU公用许可证的指导下,Linux是免费使用的。 LInux是由Linus Torvalds在1991年为替代MINIX研发的。

2.3.5 Mac OS X

Mac OS X其核心操作系统称为“Darwin”,基于Mach内核

Mac OS X 的Intel部分已经被验证为是一个UNIX系统

2.3.6 Solaris

Solaris是由Sun Microsystems开发的UNIX系统版本。基于SVR4

2005年后开源大部分代码,作为OpenSolaris开放源代码操作系统的一部分,视图建立围绕Solaris的外部开发人员社区。

2.3.7 其他UNIX系统

  • AIX,IBM版本的UNIX

  • HP-UX, HP版本的UNIX

  • IRIX, Sillicon Graphics版的UNIX

  • UnixWare, SVR4派生的UNIX系统,现由SCO销售

2.5 限制

  • 编译时限制(头文件)

  • 运行时限制

    • 与文件或目录无关的运行时限制(sysconf函数)

    • 与文件或目录有关的运行时限制(Pathconf和fpathconf函数)

2.5.1 ISO C限制

ISO C定义的所有编译时限制都列在头文件<limit.h>中 image.png image.png

2.5.2 POSIX限制

POSIX.1定义了许多操作系统实现限制的常量。我们只关心与基本POSIX.1接口有关的部分,分为下列7类: image.png

tips:其中一些限制的最小值在实际应用中太小了。这意味着如果想超过该限制,则在编译时不能使用这些常量作为数组长度

2.5.3 XSI限制

2.5.4函数sysconf,pathconf, fpathconf

这些函数可以拿到运行时限制的限制值

#include <unistd.h>
​
long sysconf(int name);
long pathconf(const char *pathname, int name);
long fpathconf(int fd, int name);

sysconf限制示例: image.png

pathconf与fpathconf限制示例 image.png

2.7 功能测试宏

许多实现中头文件不只包含POSIX.1和XSI定义的常量与符号,大多数实现在这些头文件中加入了自己的定义,为了在编译一个程序时,希望只与POSIX的定义相关,而不与任何实现定义的常量冲突,就需要定义常量_POSIX_C_SOURCE,它可以用来排除任何实现专有的定义。

常量==POSIX_C_SOURCE== 及==XOPEN_SOURCE== 被称功能测试宏 (feature test macro)。所有功能测试宏都以下划线开始。当要使用它们时,通常在cc 命令行中以下列方式定义:

cc -D_POSIX_C_SOURCE=200809L file.c
​
#例如只想使用POSIX.1定义
#define_POSIX_C_SOURCE 200809L
​
#例如想要使SUSV4的XSI选项可由应用程序使用,需将常量_XOPEN_SOURCE定义为700
#可以使用-std=c99选项在gcc 的C编译器中启用1999 ISOC 扩展,如下所示:
gce -D_XOPEN_SOURCE=700 -std=c99 file.c -o file

2.8 基本系统数据类型

头文件<sys/types.h>定义了某些与实现有关的数据类型,被称为基本系统数据类型(primitive system data type) 这些数据类型都是用C的typedef定义,绝大多数都以_t 结尾。 这种方式可以在使用这些数据类型时,不再需要考虑因系统不同而变化的程序实现细节

image.png

2.9标准之间的冲突

总体而言,不同标准配合较好。如果出现冲突,例如POSIX.1和ISO C,则POSIX.1服从ISO C

冲突例子: ISO C定义了 clock 函数,它返回进程使用的CPU 时间,返回值是clock_t 类型值,但ISO C标准没有规定它的单位。为了将此值变換成以秒为单位,需要将其除以在 time。h>头文件中定义的CLOCKS_PER_SEC。POSIX.1 定义了times 函数,它返回其调用者及其所有终止子进程的 CPU 时间以及时钟时间,所有这些值都是 clock_t 类型值。sysconf 函数用来获得每秒滴答数,用于表示 times 函数的返回值。ISO C 和POSIX.1 用同一种数据类型(clock_t)来保存对时间的测量,但定义了不同的单位。这种差别可以在 Solaris 中看到,其中 clock 返回微秒数(CLOCK_PER_SEC是100万),而 sysconf 內每秒滴答数返回的值是100。因此,我们在使用 clock_t 类型变量的时候,必须十分小心以免混淆不同的时间单位。


评论