APUE读书笔记-02UNIX标准和实现(1)

作者: QuietHeart | 来源:发表于2020-03-29 08:08 被阅读0次

    1、简介

    为了UNIX编程环境以及C语言编程的标准化,已经做过了许许多多的工作。尽管应用程序在不同版本间的UNIX操作系统中的可移植性是非常强的,但是20世纪80年代期间随着各种具有不同特性的版本的出现,使得大量的用户(例如U.S.政府等)要求对此进行标准化。

    在本章中,我们首先看到过去的20年间所做的各种不同的标准化的努力。然后,我们会讨论针对本书中所涉及到的、系统实现中的、UNIX编程标准化上面的努力。所有标准化中,一个重要的部分就是每种实现所定义的各种不同的限制规范,所以,我们也会看到这些限制以及定义它们的各种不同方法。

    译者注

    原文参考

    参考: APUE2/ch02lev1sec1.html

    2、UNIX标准

    (1) ISO C

    在1989年晚些时候,用于C语言的ANSI Standard X3.1591989( ANSI 标准)通过了认可。这个标准被国际标准 ISO/IEC 9899:1990 采纳。 ANSI 是“American National Standards Institute”也就是美国国家标准协会的简称。它是 ISO (“International Organization for Standardization”的简称,即国际标准化组织)中代表美国的一员。 IEC 是“International Electrotechnical Commission”的简称,即国际电工技术委员会(从本书第一版此处翻译看出,一般 ISO C 应该和 ANSI C 是一个东西 )。

    这个C标准现在被 ISO/IEC 中的C程序语言的国际标准化工作组维护和开发,也就是 ISO/IEC JTC1/SC22/WG14 ,简称 WG14ISO C 标准的目的就是为不同种类的操作系统提供可移植的C程序,而不仅仅是在 UNIX 系统上面。这个标准不仅定义了C语言的语法和语义,也定义了一个标准库。这个标准库非常重要,当前绝大多数UNIX系统(例如我们本书所提到的几个系统)都提供其库函数的实现。

    在1999年, ISO C 标准更新,并且被采纳为 ISO/IEC 9899:1999 ,为数字处理方面的程序提供了极大的支持。这个变化,除了其中某些函数中的 restrict 关键字之外,并没有影响到本书中所提到的 POSIX 标准。而这个关键字就是用来告诉编译器那些指针可以被优化,优化的方法就是将引用对象的那个指针标记成在函数内部,只能通过那个指针来访问所引用的对象。

    和大多数的标准一样,在标准被采纳以及修改软件以适应被采纳的标准之间,总会有一个延迟。随着供应商编译系统的发展,他们会加入更多对最新版本的 ISO C 标准的支持。

    当前 gcc 编译器对 ISO C 1999 年版本的支持程度,可以大致参见 http://www.gnu.org/software/gcc/c99status.html

    ISO C 库基于其标准所定义的头文件,被分成24个区域,下面表格列出了这个C标准所定义的头文件。 POSIX.1 标准包含了这些头文件,其他的标准也是。在表格中,我们也列出了本书中所涉及的四个系统( FreeBSD 5.2.1 , Linux 2.4.22 , Mac OS X 10.3 , 和 Solaris 9 )支持这些头文件的哪些。

    ISO C 标准定义的头文件

    +------------------------------------------------------------------------------------------------------------+
    |    Header    |   FreeBSD   |   Linux    |  Mac OS X   | Solaris |               Description                |
    |              |    5.2.1    |   2.4.22   |    10.3     |    9    |                                          |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <assert.h>   |      •      |     •      |      •      |    •    | verify program assertion                 |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <complex.h>  |      •      |     •      |      •      |         | complex arithmetic support               |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <ctype.h>    |      •      |     •      |      •      |    •    | character types                          |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <errno.h>    |      •      |     •      |      •      |    •    | error codes (Section 1.7)                |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <fenv.h>     |             |     •      |      •      |         | floating-point environment               |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <float.h>    |      •      |     •      |      •      |    •    | floating-point constants                 |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <inttypes.h> |      •      |     •      |      •      |    •    | integer type format conversion           |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <iso646.h>   |      •      |     •      |      •      |    •    | alternate relational operator macros     |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <limits.h>   |      •      |     •      |      •      |    •    | implementation constants (Section 2.5)   |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <locale.h>   |      •      |     •      |      •      |    •    | locale categories                        |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <math.h>     |      •      |     •      |      •      |    •    | mathematical constants                   |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <setjmp.h>   |      •      |     •      |      •      |    •    | nonlocal goto (Section 7.10)             |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <signal.h>   |      •      |     •      |      •      |    •    | signals (Chapter 10)                     |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <stdarg.h>   |      •      |     •      |      •      |    •    | variable argument lists                  |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <stdbool.h>  |      •      |     •      |      •      |    •    | boolean type and values                  |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <stddef.h>   |      •      |     •      |      •      |    •    | standard definitions                     |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <stdint.h>   |      •      |     •      |      •      |         | integer types                            |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <stdio.h>    |      •      |     •      |      •      |    •    | standard I/O library (Chapter 5)         |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <stdlib.h>   |      •      |     •      |      •      |    •    | utility functions                        |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <string.h>   |      •      |     •      |      •      |    •    | string operations                        |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <tgmath.h>   |             |     •      |             |         | type-generic math macros                 |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <time.h>     |      •      |     •      |      •      |    •    | time and date (Section 6.10)             |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <wchar.h>    |      •      |     •      |      •      |    •    | extended multibyte and wide character    |
    |              |             |            |             |         | support                                  |
    |--------------+-------------+------------+-------------+---------+------------------------------------------|
    | <wctype.h>   |      •      |     •      |      •      |    •    | wide character classification and        |
    |              |             |            |             |         | mapping support                          |
    +------------------------------------------------------------------------------------------------------------+
    

    这些 ISO C 头文件,依赖于操作系统所使用的C编译器的版本。例如, FreeBSD 5.2.1 实用 gcc 的3.3.3版本, Linux 2.4.22 使用 gcc 的3.3.1版本等,所以,要注意当前你操作系统使用的编译器版本。

    (2) IEEE POSIX

    POSIX 是一个电气电子工程师协会( 即Institute of Electrical and Electronics Engineers,简称 IEEE )制定的协议族。 POSIX (Portable Operating System Interface的简称),即可移植的操作系统接口。它原来只是指的 IEEE Standard 1003.11988 ,也就是操作系统接口,但是后来 1003 指定下,它被扩展包含许多标准和草案标准,包含了 shell 以及公共程序标准( 1003.2 )。

    本书所关注的是 1003.1 的操作系统接口标准,这个标准是为了增加应用程序在不同的UNIX系统环境下的可移植性。这个标准定义了一个遵从 POSIX 的操作系统所必须提供的服务,并且这个标准被许多的计算机供应商采纳。尽管 1003.1 标准基于UNIX操作系统,但是这个标准并不限于UNIX和类UNIX系统。实际上,许多提供操作系统的供应商都声称他们的操作系统除了包含一些专有的特性,也是遵从 POSIX 标准的。

    因为 1003.1 标准只定义了接口并没有定义实现,所以并没有系统调用库函数之间的区分。所有标准中的例程都是函数。

    各种标准都在发展, 1003.1 标准也是。这个标准的1988年版本,也就是 IEEE Standard 1003.11988 ,被修改并且提交给了 ISO ,除了一些文本上的变化,它并没有添加新的接口。最终的文档作为 IEEE Std 1003.11990 ( IEEE 1990 ]被发布,这也是 international standard ISO/IEC 99451:1990 。这个标准通常被称作 POSIX.1 ,这也是我们本文所采用的标准。

    IEEE 1003.1 工作组仍然在对这个标准进行一些修改。在1993年,一个校订版本的 IEEE 1003.1 标准被发布出来。它包含了 1003.1-1990 标准 和 1003.1b-1993 实时扩展标准。在1996年,这个标准又更新为 international standard ISO/IEC 99451:1996 ,它包含了多线程编程的相关标准,被称作 pthreads for POSIX threads 。在1999年发行的 IEEE Standard 1003.1d-1999 中,也添加了更多的实时接口。几年之前, IEEE Standard 1003.1j-2000 也发布了,包含了更多的实时接口,同时也发布了 IEEE Standard 1003.1q-2000 ,它为这个标准添加了实践跟踪扩展方面的内容。

    1003.1 的2001版本被从它之前的版本中分离出来,因为它将一些 1003.1 增加的内容, 1003.2 标准,以及 Single UNIX Specification (简称 SUS )的部分内容, Version 2 ( more on this later ),结合起来,最终的标准,也就是 IEEE Standard 1003.1-2001 ,包含了如下的其他标准:

    ISO/IEC 9945-1 (IEEE Standard 1003.1-1996), which includes
            IEEE Standard 1003.1-1990
            IEEE Standard 1003.1b-1993 (real-time extensions)
            IEEE Standard 1003.1c-1995 (pthreads)
            IEEE Standard 1003.1i-1995 (real-time technical corrigenda)
    
    IEEE P1003.1a draft standard (system interface revision)
    
    IEEE Standard 1003.1d-1999 (advanced real-time extensions)
    
    IEEE Standard 1003.1j-2000 (more advanced real-time extensions)
    
    IEEE Standard 1003.1q-2000 (tracing)
    
    IEEE Standard 1003.2d-1994 (batch extensions)
    
    IEEE P1003.2b draft standard (additional utilities)
    
    Parts of IEEE Standard 1003.1g-2000 (protocol-independent interfaces)
    
    ISO/IEC 9945-2 (IEEE Standard 1003.2-1993)
    
    The Base Specifications of the Single UNIX Specification, version 2, which include
            System Interface Definitions, Issue 5
            Commands and Utilities, Issue 5
            System Interfaces and Headers, Issue 5
    
    Open Group Technical Standard, Networking Services, Issue 5.2
    
    ISO/IEC 9899:1999, Programming Languages - C
    

    下面的表格中,列出了所需要的和可选的被 POSIX.1 制定的头文件。因为 POSIX.1 包含了 ISO C 标准,所以它也要求前面表格中列出的内容。这所有四个表格,也给出了本书所提到的系统支持其中的哪些头文件。

    POSIX 标准要求的头文件定义

    +-----------------------------------------------------------------------------------------------------------+
    |    Header     |   FreeBSD   |   Linux    |  Mac OS X   | Solaris |              Description               |
    |               |    5.2.1    |   2.4.22   |    10.3     |    9    |                                        |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <dirent.h>    |      •      |     •      |      •      |    •    | directory entries (Section 4.21)       |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <fcntl.h>     |      •      |     •      |      •      |    •    | file control (Section 3.14)            |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <fnmatch.h>   |      •      |     •      |      •      |    •    | filename-matching types                |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <glob.h>      |      •      |     •      |      •      |    •    | pathname pattern-matching types        |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <grp.h>       |      •      |     •      |      •      |    •    | group file (Section 6.4)               |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <netdb.h>     |      •      |     •      |      •      |    •    | network database operations            |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <pwd.h>       |      •      |     •      |      •      |    •    | password file (Section 6.2)            |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <regex.h>     |      •      |     •      |      •      |    •    | regular expressions                    |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <tar.h>       |      •      |     •      |      •      |    •    | tar archive values                     |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <termios.h>   |      •      |     •      |      •      |    •    | terminal I/O (Chapter 18)              |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <unistd.h>    |      •      |     •      |      •      |    •    | symbolic constants                     |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <utime.h>     |      •      |     •      |      •      |    •    | file times (Section 4.19)              |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <wordexp.h>   |      •      |     •      |             |    •    | word-expansion types                   |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <arpa/inet.h> |      •      |     •      |      •      |    •    | Internet definitions (Chapter 16)      |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <net/if.h>    |      •      |     •      |      •      |    •    | socket local interfaces (Chapter 16)   |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <netinet/     |      •      |     •      |      •      |    •    | Internet address family (Section 16.3) |
    | in.h>         |             |            |             |         |                                        |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <netinet/     |      •      |     •      |      •      |    •    | Transmission Control Protocol          |
    | tcp.h>        |             |            |             |         | definitions                            |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <sys/mman.h>  |      •      |     •      |      •      |    •    | memory management declarations         |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <sys/         |      •      |     •      |      •      |    •    |    select function (Section 14.5.1)    |
    | select.h>     |             |            |             |         |                                        |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <sys/         |      •      |     •      |      •      |    •    | sockets interface (Chapter 16)         |
    | socket.h>     |             |            |             |         |                                        |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <sys/stat.h>  |      •      |     •      |      •      |    •    | file status (Chapter 4)                |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <sys/times.h> |      •      |     •      |      •      |    •    | process times (Section 8.16)           |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <sys/types.h> |      •      |     •      |      •      |    •    | primitive system data types (Section   |
    |               |             |            |             |         | 2.8)                                   |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <sys/un.h>    |      •      |     •      |      •      |    •    | UNIX domain socket definitions (       |
    |               |             |            |             |         | Section 17.3)                          |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <sys/         |      •      |     •      |      •      |    •    | system name (Section 6.9)              |
    | utsname.h>    |             |            |             |         |                                        |
    |---------------+-------------+------------+-------------+---------+----------------------------------------|
    | <sys/wait.h>  |      •      |     •      |      •      |    •    | process control (Section 8.6)          |
    +-----------------------------------------------------------------------------------------------------------+
    

    POSIX 标准定义的 XSI 扩展头文件

    +-----------------------------------------------------------------------------------------------------------+
    |     Header     |   FreeBSD   |   Linux    |  Mac OS X   | Solaris  |             Description              |
    |                |    5.2.1    |   2.4.22   |    10.3     |    9     |                                      |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <cpio.h>       |      •      |     •      |             |    •     | cpio archive values                  |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <dlfcn.h>      |      •      |     •      |      •      |    •     | dynamic linking                      |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <fmtmsg.h>     |      •      |     •      |             |    •     | message display structures           |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <ftw.h>        |             |     •      |             |    •     | file tree walking (Section 4.21)     |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <iconv.h>      |             |     •      |      •      |    •     | codeset conversion utility           |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <langinfo.h>   |      •      |     •      |      •      |    •     | language information constants       |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <libgen.h>     |      •      |     •      |      •      |    •     | definitions for pattern-matching     |
    |                |             |            |             |          | function                             |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <monetary.h>   |      •      |     •      |      •      |    •     | monetary types                       |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <ndbm.h>       |      •      |            |      •      |    •     | database operations                  |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <nl_types.h>   |      •      |     •      |      •      |    •     | message catalogs                     |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <poll.h>       |      •      |     •      |      •      |    •     | poll function (Section 14.5.2)       |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <search.h>     |      •      |     •      |      •      |    •     | search tables                        |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <strings.h>    |      •      |     •      |      •      |    •     | string operations                    |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <syslog.h>     |      •      |     •      |      •      |    •     | system error logging (Section 13.4)  |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <ucontext.h>   |      •      |     •      |      •      |    •     | user context                         |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <ulimit.h>     |      •      |     •      |      •      |    •     | user limits                          |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <utmpx.h>      |             |     •      |             |    •     | user accounting database             |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <sys/ipc.h>    |      •      |     •      |      •      |    •     | IPC (Section 15.6)                   |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <sys/msg.h>    |      •      |     •      |             |    •     | message queues (Section 15.7)        |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <sys/          |      •      |     •      |      •      |    •     | resource operations (Section 7.11)   |
    | resource.h>    |             |            |             |          |                                      |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <sys/sem.h>    |      •      |     •      |      •      |    •     | semaphores (Section 15.8)            |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <sys/shm.h>    |      •      |     •      |      •      |    •     | shared memory (Section 15.9)         |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <sys/          |      •      |     •      |             |    •     | file system information              |
    | statvfs.h>     |             |            |             |          |                                      |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <sys/time.h>   |      •      |     •      |      •      |    •     | time types                           |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <sys/timeb.h>  |      •      |     •      |      •      |    •     | additional date and time definitions |
    |----------------+-------------+------------+-------------+----------+--------------------------------------|
    | <sys/uio.h>    |      •      |     •      |      •      |    •     | vector I/O operations (Section 14.7) |
    +-----------------------------------------------------------------------------------------------------------+
    

    POSIX 标准定义的可选头文件

    +-----------------------------------------------------------------------------------------------------------+
    |    Header     |   FreeBSD    |    Linux    |   Mac OS X   | Solaris  |            Description             |
    |               |    5.2.1     |   2.4.22    |     10.3     |    9     |                                    |
    |---------------+--------------+-------------+--------------+----------+------------------------------------|
    | <aio.h>       |      •       |      •      |      •       |    •     | asynchronous I/O                   |
    |---------------+--------------+-------------+--------------+----------+------------------------------------|
    | <mqueue.h>    |      •       |             |              |    •     | message queues                     |
    |---------------+--------------+-------------+--------------+----------+------------------------------------|
    | <pthread.h>   |      •       |      •      |      •       |    •     | threads (Chapters 11 and 12)       |
    |---------------+--------------+-------------+--------------+----------+------------------------------------|
    | <sched.h>     |      •       |      •      |      •       |    •     | execution scheduling               |
    |---------------+--------------+-------------+--------------+----------+------------------------------------|
    | <semaphore.h> |      •       |      •      |      •       |    •     | semaphores                         |
    |---------------+--------------+-------------+--------------+----------+------------------------------------|
    | <spawn.h>     |              |      •      |              |          | real-time spawn interface          |
    |---------------+--------------+-------------+--------------+----------+------------------------------------|
    | <stropts.h>   |              |      •      |              |    •     | XSI STREAMS interface (Section     |
    |               |              |             |              |          | 14.4)                              |
    |---------------+--------------+-------------+--------------+----------+------------------------------------|
    | <trace.h>     |              |             |              |          | event tracing                      |
    +-----------------------------------------------------------------------------------------------------------+
    

    在本文中,我们讨论 POSIX.12001 版本,这个版本包含了 ISO C 所指定的函数。它的接口被分为要求的和可选的两个部分。可选部分接口又根据其功能被分成 50 个段。这些段包含下面表中列出的还未过时的编程接口,以及它们各自的选项代码。选项代码一半就是2到3个字符的简称,这简称有助于标记接口所属的功能域。若相应接口依赖于选项(???)的支持,那么其选项代码在 man 手册中,以高亮文本方式显示出来,多数的选项都和实时扩展相关。

    POSIX.1 可选接口组和代码

    +------------------------------------------------------------------------------------------------------+
    | Code | SUS mandatory |         Symbolic constant         |                Description                |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | ADV  |               | _POSIX_ADVISORY_INFO              | advisory information (real-time)          |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | AIO  |               | _POSIX_ASYNCHRONOUS_IO            | asynchronous input and output (real-time) |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | BAR  |               | _POSIX_BARRIERS                   | barriers (real-time)                      |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | CPT  |               | _POSIX_CPUTIME                    | process CPU time clocks (real-time)       |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | CS   |               | _POSIX_CLOCK_SELECTION            | clock selection (real-time)               |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | CX   |       •       |                                   | extension to ISO C standard               |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | FSC  |       •       | _POSIX_FSYNC                      | file synchronization                      |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | IP6  |               | _POSIX_IPV6                       | IPv6 interfaces                           |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | MF   |       •       | _POSIX_MAPPED_FILES               | memory-mapped files                       |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | ML   |               | _POSIX_MEMLOCK                    | process memory locking (real-time)        |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | MLR  |               | _POSIX_MEMLOCK_RANGE              | memory range locking (real-time)          |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | MON  |               | _POSIX_MONOTONIC_CLOCK            | monotonic clock (real-time)               |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | MPR  |       •       | _POSIX_MEMORY_PROTECTION          | memory protection                         |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | MSG  |               | _POSIX_MESSAGE_PASSING            | message passing (real-time)               |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | MX   |               |                                   | IEC 60559 floating-point option           |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | PIO  |               | _POSIX_PRIORITIZED_IO             | prioritized input and output              |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | PS   |               | _POSIX_PRIORITIZED_SCHEDULING     | process scheduling (real-time)            |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | RS   |               | _POSIX_RAW_SOCKETS                | raw sockets                               |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | RTS  |               | _POSIX_REALTIME_SIGNALS           | real-time signals extension               |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | SEM  |               | _POSIX_SEMAPHORES                 | semaphores (real-time)                    |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | SHM  |               | _POSIX_SHARED_MEMORY_OBJECTS      | shared memory objects (real-time)         |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | SIO  |               | _POSIX_SYNCHRONIZED_IO            | synchronized input and output (real-time) |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | SPI  |               | _POSIX_SPIN_LOCKS                 | spin locks (real-time)                    |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | SPN  |               | _POSIX_SPAWN                      | spawn (real-time)                         |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | SS   |               | _POSIX_SPORADIC_SERVER            | process sporadic server (real-time)       |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TCT  |               | _POSIX_THREAD_CPUTIME             | thread CPU time clocks (real-time)        |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TEF  |               | _POSIX_TRACE_EVENT_FILTER         | trace event filter                        |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | THR  |       •       | _POSIX_THREADS                    | threads                                   |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TMO  |               | _POSIX_TIMEOUTS                   | timeouts (real-time)                      |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TMR  |               | _POSIX_TIMERS                     | timers (real-time)                        |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TPI  |               | _POSIX_THREAD_PRIO_INHERIT        | thread priority inheritance (real-time)   |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TPP  |               | _POSIX_THREAD_PRIO_PROTECT        | thread priority protection (real-time)    |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TPS  |               | _POSIX_THREAD_PRIORITY_SCHEDULING | thread execution scheduling (real-time)   |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TRC  |               | _POSIX_TRACE                      | trace                                     |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TRI  |               | _POSIX_TRACE_INHERIT              | trace inherit                             |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TRL  |               | _POSIX_TRACE_LOG                  | trace log                                 |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TSA  |       •       | _POSIX_THREAD_ATTR_STACKADDR      | thread stack address attribute            |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TSF  |       •       | _POSIX_THREAD_SAFE_FUNCTIONS      | thread-safe functions                     |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TSH  |       •       | _POSIX_THREAD_PROCESS_SHARED      | thread process-shared synchronization     |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TSP  |               | _POSIX_THREAD_SPORADIC_SERVER     | thread sporadic server (real-time)        |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TSS  |       •       | _POSIX_THREAD_ATTR_STACKSIZE      | thread stack address size                 |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | TYM  |               | _POSIX_TYPED_MEMORY_OBJECTS       | typed memory objects (real-time)          |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | XSI  |       •       | _XOPEN_UNIX                       | X/Open extended interfaces                |
    |------+---------------+-----------------------------------+-------------------------------------------|
    | XSR  |               | _XOPEN_STREAMS                    | XSI STREAMS                               |
    +------------------------------------------------------------------------------------------------------+
    

    POSIX 并没有包含超级用户的概念,但是它的一些特定操作要求有“特殊的权限”, POSIX 将其留给了实现自己定义。遵从国防部安全性指导原则( Department of Defense security guidelines )的 UNIX 系统都有许多的安全级别。然而本文中,我们只是使用使用传统的属于,并且会指出那些操作需要超级用户权限。

    经过了几乎20多年的工作,这些标准日趋成熟和稳定。 POSIX.1 标准被一个开放性的工作组所维护,这个工作组被称作 Austin Group (http://www.opengroup.org/austin)。为确保它们的适用性,这些标准需要每隔一段时间就进行重申和更新。

    (3)Single UNIX Specification

    这个单一UNIX规范(翻译起来读着很别扭,还不如不翻译_),是 POSIX.1 标准的超集,它额外地制定了一些接口,对基本的 POSIX.1 进行了扩展。这些完整的系统接口的集合被称作 X/Open System Interface ( XSI )。常数变量 _XOPEN_UNIX 所标记的那些接口,就是对基本 POSIX.1 接口进行了 XSI 扩展的那部分接口。

    XSI 也定义了必须为一个遵从 XSI 的实现提供哪些 POSIX.1 的可选部分。这些部分包括文件同步,内存映射文件,内存保护,以及线程接口,这些在前面的途中被标记了 SUS mandatory. 。只有遵从 XSI 的实现,才能够被称作UNIX系统。

    开放组织( The Open Group )拥有UNIX的商标,并且使用 Single UNIX Specification 来定义实现必须支持的接口,这样实现才能被称作UNIX系统。实现必须是文件描述一致的,通过了检测一致性的测试套件的测试,并且将许可证授权给UNIX商标。

    有些在 XSI 中定义的额外的接口是必需的,也有另外一些是可选的。这些接口基于基本的功能,被分成可选的组。如下:

    Encryption: denoted by the _XOPEN_CRYPT symbolic constant
    Real-time: denoted by the _XOPEN_REALTIME symbolic constant
    Advanced real-time
    Real-time threads: denoted by the _XOPEN_REALTIME_THREADS symbolic constant
    Advanced real-time threads
    Tracing
    XSI STREAMS: denoted by the _XOPEN_STREAMS symbolic constant
    Legacy: denoted by the _XOPEN_LEGACY symbolic constant
    

    Single UNIX Specification ( SUS ) 是由 The Open Group 发行的,它是在1996年的时候由 X/Openthe Open Software Foundation ( OSF )两个组织合并形成的。 X/Open 以前发行 X/Open Portability Guide ,而此采取特定的标准并且填补一些确实的功能的空白。这些指导规范都是想要通过只遵循一系列公共标准的方式,来提高应用程序可移植特性的可能性。

    Single UNIX Specification 的第一个版本通过 X/Open 在1994年发行。它也被称作 Spec 1170 ,因为它大致包含了 1170 个接口。它最初来自 the Common Open Software Environment ( COSE ) ,这个 COSE 的目标是更好的提高应用程序在所有的UNIX操作系统上面的可移植特性。 COSE groupSun ,IBM,惠普,Novell/ USL和OSFwent并不只是赞同了这些标准。他们还调查了一些通用的常用软件所使用的接口。而最终的 1170 个接口,就是从这些应用中选择出来的,也包含了 X/Open Common Application Environment ( CAE ), Issue 4 (相应于其先前的规则 the X/Open Portability Guide ,它被称作 XPG4 ), the System V Interface Definition ( SVID ), Edition 3 , Level 1 interfaces , 以及 the OSF Application Environment Specification ( AES ) Full Use interfaces

    Single UNIX Specification 的第二个版本,通过 The Open Group ,在1997年被发行。最新的版本添加了对线程的支持,实时接口,64位处理,大文件,以及加强的多字节字符处理。

    Single UNIX Specification (简称 SUSv3 )的第三个版本被 The Open Group 在2001年发行。 SUSv3 的基本规范和 IEEE Standard 1003.1-2001 一样,并且分成四个小节:基本定义,系统接口, shell 和通用工具,以及理念。 SUSv3 也包含了 X/Open Curses Issue 4 , Version 2 ,但是它并不是 POSIX.1 的一个部分。

    在2002年, ISO 将这个版本采纳为 International Standard ISO/IEC 9945:2002 ,2003年的时候 The Open Group1003.1 标准更新,包含了一些技术的修正,然后 ISO 将这个采纳为 International Standard ISO/IEC 9945:2003 。2004年4月, The Open Group 公布了 Single UNIX Specification版本3,2004修订版 。在这个标准的正文中包含了更多的技术修正。

    (4) FIPS

    FIPSFederal Information Processing Standard 的简称,也就是联邦信息处理标准。由美国政府出版,并且用于计算机系统的购置。 FIPS 1511 (1989年4月)基于 IEEE Std. 1003.11988 以及一个 ANSI C 标准草案。之后是 FIPS 1512 (1993年5月),它基于 IEEE Standard 1003.11990FIPS 1512 要求一些 POSIX.1 中做为可选部分列出的特性,这些可选的部分被 POSIX.1-2001 强制性包含。

    POSIX.1 FIPS 的作用就是它要求任何想要将 POSIX.1 兼容的计算机系统出售给美国政府的供应商支持一些 POSIX.1 可选的特性。这个 POSI.1 FIPS 已经被取消了,我们也不再对它进行更多的讨论。

    参考:
    http://book.chinaunix.net/special/ebook/addisonWesley/APUE2/0201433079/ch02lev1sec2.html

    译者注

    原文参考

    参考: APUE2/ch02lev1sec2.html

    3、UNIX系统实现

    前面的章节讨论了 ISO C , IEEE POSIX 以及 Single UNIX Specification 。这三个标准是由独立的组织创建的。然而,标准也不过就是接口的规范。这些标准是怎样和实际相关联的呢?这些标准实际被供应商采纳,然后将其转化成实际的实现。本书中,我们对这些标准以及它们的实现都会有所涉及。

    对于UNIX系统的历史,具体可以参见原书中指明的参考资料。任何均从版本6(1976年)以及版本7(1979年)的、运行在 PDP-11 的UNIX 共享分时系统(一般就称作版本6和版本7)而来。这些是贝尔实验室外发行的最开始的版本。然后产生了三个分支:

    1. 一个是在AT&T中,导致产生 System IIISystem V ,也就是所谓的商业UNIX系统。
    2. 一个是伯克利的加利福尼亚大学的版本,导致产生了 4.xBSD 的实现。
    3. 在AT&T计算科学研究中心的贝尔实验室研究的UNIX系统版本,导致产生了 UNIX共享分时系统的第8,9版本 ,然后结束于1990年的第10版本。

    (1) UNIX System V Release 4

    UNIX System V Release 4 ( SVR4 ),(这个翻译成UNIX 系统V版本4有点别扭,直接采用原名了)是AT&T的UNIX系统实验室( USL ,原来是AT&T UNIX软件操作)生产的。 SVR4 并入了AT&T的 System V Release 3.2 ( SVR3.2 )、Sun Microsystems的 SunOS 操作系统、加利福尼亚大学的 4.3BSD 、以及微软的 Xenix 系统的功能,形成了一个一致的操作系统。( Xenix 原来开发来自 Version 7 ,后来从 System V 中采纳了许多功能)。 SVR4 源代码发布于1989年末,1990年第一次向最终用户提供可用版本。 SVR4 遵从 POSIX 1003.1 标准和 the X/Open Portability Guide , Issue 3 ( XPG3 ).

    AT&T也发布了 System V Interface Definition ( SVID ) [AT&T 1989]. SVID 的第3次发行指定如果一个操作系统遵从 UNIX System V Release 4 实现所必须提供的功能。和 POSIX.1 一样, SVID 指定了一个接口而非实现。在 SVID 中,系统调用和库函数并没有什么不同之处。请参考 manual 手册中的信息来了解 SVR4 的实现的不同[AT&T 1990e]。

    (2) 4.4BSD

    BSD 是The Berkeley Software Distribution的简称,它的发行版由伯克利的加利福尼亚大学的Computer Systems Research Group ( CSRG ) 来发行。1983年发布了 4.2BSD ,1986年发布了 4.3BSD 。两个发行版本都运行在 VAX 微机上。后来1988年发布的 4.3BSD Tahoe 也运行在一个被称为 Tahoe 的微机上。后来1990年有了 4.3BSD Reno 发行版,支持许多 POSIX.1 特性。

    原来的 BSD 系统包含AT&T的专有代码,并且需要AT&T的许可证。我们必须拥有AT&T的UNIX代码许可,才能够获得 BSD 系统的源代码。后来,这个状况改变了,越来越多的AT&T代码被非AT&T代码所替代,并且越来越多的特性被添加到基于非AT&T代码的 BSD 系统中。

    1989年,伯克利将 4.3BSDTahoe 中很多非AT&T源代码提取,并使其成为公众可用的 BSD 网络软件, 1.0 版。其后则有 BSD 网络软件的 2.0 版,它是从 4.3BSD Reno 版导出的,其目的是使大部分 4.4BSD 系统不再受AT&T许可证的限制,其全部源代码都可为公众使用。

    4.4BSD-Lite 其目的是作为最后一版 CSRG 发行。因为和 USL 有法律上的纠纷,它的引入被延迟了。当纠纷解决之后,它很快就在1994年发行了,它不需要任何 UNIX 源代码授权。1995年, CSRG 后来又在此之后发布了一个修正了一些 bug 的版本。这个版本,叫做 4.4BSD-Lite , release 2 ,它就是 CSRG 的最后一个 BSD 版本。

    在伯克利所进行的 UNIX 开发工作是从 PDP-11 开始的,然后转移到 VAX 微机上,再后来又转移到工作站上。90年代早期,伯克利得到支持在广泛应用的 80386 个人计算机上开发 BSD 版本,于是产生了 386BSD 。这一工作是由 Bill Jolitz 完成的,其相关文档有发表在 1991年Dr.Dobb´s Journal上的系列文章(每月一篇)。其中很多代码出现在 BSD 网络软件 2.0 版中。

    (3) FreeBSD

    FreeBSD 基于 4.4BSD-Lite 操作系统。在伯克利的加利福尼大学的Computing Science Research Group结束对 BSD 版本操作系统的开发工作之后,以及同时 386BSD 已经被搁置了很久的情况下, FreeBSD 项目项目在 BSD 之后继续进行开发。

    所有 FreeBSD 项目下产生的软件无论是二进制文件还是源代码形式的文件都是免费自由的。 The FreeBSD 5.2.1 也是本书中所使用的四个用来测试其例子的系统之一。

    当然也有一些其它的基于 BSD 的免费操作系统。 NetBSD 项目( http : //www.netbsd.org )类似 FreeBSD 项目但是强调硬件平台之间的移植特性; OpenBSD 项目 (http://www.openbsd.org) 也和 FreeBSD 很类似但是强调安全性。

    (4) Linux

    Linux 是一个提供了丰富的Unix编程环境的操作系统,并且它是自由免费的,在 GNU 公共许可协议下。 Linux 的流行在某些程度上也反映了计算机工业的发展。 Linux 经常是第一个支持新的硬件的操作系统。

    Linux 在1991年由Linus Torvalds编写用来作为 MINIX 的一个替代品。这个举动很快迅速地发展成为一个伟大的项目,许多来自世界各地的开发者都奉献了他们的宝贵的时间来加强和使用这个系统。

    Linux 发行的 Mandrake9.2 发行版作为本书测试例子的系统之一,这个发行版本使用的是 2.4.22 版的 Linux 操作系统内核。

    (5) Mac OS X

    Mac OS X 所基于的技术和原来的版本完全不同。这个操作系统的内核被叫做 Darwin ,基于 Mach 内核以及 FreeBSD 系统。 Darwin 被作为一个开放源代码项目进行管理,和 FreeBSD 以及 Linux 很类似。

    Mac OS X 的版本 10.3 ( Darwin 7.4.0 )被作为本书的测试例子所运行的操作系统之一。

    (6) Solaris

    Solaris 是由Sun Microsystems开发的 UNIX 系统。基于 System V Release 4 ,被Sun Microsystems的设计师们完善了近10年。它是仅有的成功的商业 SVR4 的衍生品,并且原来就是被 Unix 系统认证了的。(关于 UNIX 认证更多的信息,参考:http://www.opengroup.org/certification/idx/unix.html

    Solaris 9 UNIX 系统被作为本书的测试例子所运行的操作系统之一。

    (7)其他UNIX系统

    以前其他被认证的UNIX系统包括:

    1. AIX , IBM's 版本的UNIX系统
    2. HP-UX , Hewlett-Packard's版本的UNIX系统
    3. IRIX ,来自 Silicon Graphics的UNIX系统。
    4. UnixWare , 继承自 SVR4 的UNIX系统,并且被SCO出售。

    译者注

    原文参考

    参考: APUE2/ch02lev1sec3.html

    4、标准和实现的关系

    我们所提到的标准定义了任何一个实际系统的子集。这本书的重点提及到的是四个实际的系统: FreeBSD 5.2.1 , Linux 2.4.22 , Mac OS X 10.3 , 以及 Solaris 9. 尽管只有 Solaris 可以称作为 UNIX 系统,但是所有的四个操作系统都提供了一个UNIX的编程环境。因为所有这四个操作系统都在一定的程度上遵从了 POSIX 标准,我们将注意力集中于这些 POSIX.1 标准所需要的特性上面,而不是这些 POSIX 之间以及实际这四个系统实现上面的不同。那些和特定实现相关的特性也被明确地标记了,因为 SUSv3 是一个 POSIX.1 的超集,所以我们也应该注意有些特性属于 SUSv3 但是却不属于 POSIX.1

    我们需要注意实现提供了一些对早期版本向后兼容的特性,例如 SVR3.24.3BSD 。例如, Solaris 支持 POSIX.1 的非阻塞 I/O ( O_NONBLOCK )以及传统的 System V 方法( O_NDELAY )。本文,我们尽管提到了哪些非标准的特性,但是我们只使用替代了这些非标准特性的 POSIX.1 标准特性。类似 SVR3.24.3BSD 提供了和 POSIX.1 有所不同的、可靠的信号机制 。在第10章我们只描述 POSIX.1 的信号机制(当然就我读过之后发现,本书之后也介绍了可靠的信号机制)。

    译者注

    原文参考

    参考: APUE2/ch02lev1sec4.html

    相关文章

      网友评论

        本文标题:APUE读书笔记-02UNIX标准和实现(1)

        本文链接:https://www.haomeiwen.com/subject/jbsoyhtx.html