APUE读书笔记-02UNIX标准和实现(1)
1、简介
为了UNIX编程环境以及C语言编程的标准化,已经做过了许许多多的工作。尽管应用程序在不同版本间的UNIX操作系统中的可移植性是非常强的,但是20世纪80年代期间随着各种具有不同特性的版本的出现,使得大量的用户(例如U.S.政府等)要求对此进行标准化。
在本章中,我们首先看到过去的20年间所做的各种不同的标准化的努力。然后,我们会讨论针对本书中所涉及到的、系统实现中的、UNIX编程标准化上面的努力。所有标准化中,一个重要的部分就是每种实现所定义的各种不同的限制规范,所以,我们也会看到这些限制以及定义它们的各种不同方法。
译者注
原文参考
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
,简称 WG14
。 ISO 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.1
的 2001
版本,这个版本包含了 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/Open
和 the 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 Group
将 1003.1
标准更新,包含了一些技术的修正,然后 ISO
将这个采纳为 International Standard ISO/IEC 9945:2003
。2004年4月, The Open Group
公布了 Single UNIX Specification版本3,2004修订版
。在这个标准的正文中包含了更多的技术修正。
(4) FIPS
FIPS
是 Federal Information Processing Standard
的简称,也就是联邦信息处理标准。由美国政府出版,并且用于计算机系统的购置。 FIPS 1511
(1989年4月)基于 IEEE Std. 1003.11988
以及一个 ANSI C
标准草案。之后是 FIPS 1512
(1993年5月),它基于 IEEE Standard 1003.11990
。 FIPS 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
译者注
原文参考
3、UNIX系统实现
前面的章节讨论了 ISO C
, IEEE POSIX
以及 Single UNIX Specification
。这三个标准是由独立的组织创建的。然而,标准也不过就是接口的规范。这些标准是怎样和实际相关联的呢?这些标准实际被供应商采纳,然后将其转化成实际的实现。本书中,我们对这些标准以及它们的实现都会有所涉及。
对于UNIX系统的历史,具体可以参见原书中指明的参考资料。任何均从版本6(1976年)以及版本7(1979年)的、运行在 PDP-11
的UNIX 共享分时系统(一般就称作版本6和版本7)而来。这些是贝尔实验室外发行的最开始的版本。然后产生了三个分支:
- 一个是在AT&T中,导致产生
System III
和System V
,也就是所谓的商业UNIX系统。 - 一个是伯克利的加利福尼亚大学的版本,导致产生了
4.xBSD
的实现。 - 在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系统包括:
-
AIX
, IBM's 版本的UNIX系统 -
HP-UX
, Hewlett-Packard's版本的UNIX系统 -
IRIX
,来自 Silicon Graphics的UNIX系统。 -
UnixWare
, 继承自SVR4
的UNIX系统,并且被SCO出售。
译者注
原文参考
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.2
和 4.3BSD
。例如, Solaris
支持 POSIX.1
的非阻塞 I/O
( O_NONBLOCK
)以及传统的 System V
方法( O_NDELAY
)。本文,我们尽管提到了哪些非标准的特性,但是我们只使用替代了这些非标准特性的 POSIX.1
标准特性。类似 SVR3.2
和 4.3BSD
提供了和 POSIX.1
有所不同的、可靠的信号机制 。在第10章我们只描述 POSIX.1
的信号机制(当然就我读过之后发现,本书之后也介绍了可靠的信号机制)。