POSIX C言語API一覧とコマンド一覧の調べ方

## はじめに

最新の POSIX (POSIX-1.2017) には リアルタイム拡張 (POSIX.1b) やスレッド拡張 (POSIX.1c) が必須機能として標準化されています。みなさんはこれらがいつ POSIX に追加され、いつから標準機能になったのか気になったことはないでしょうか？私はあります。

POSIX が仕様を無料公開してない（公開されてるのは Open Group 版）こともあって特に POSIX が誕生した頃の情報となるとなかなか見つかりません。この間それをようやく見つけることができたのですが、PDF のせいなのか検索で引っかかりにくい情報だったため検索しやすいようにまとめました。

ISO C、SVID3、4.3BSD との比較一覧も含まれています。どんな関数やコマンドが定義されていて、どれが必須機能またはオプション機能なのかなど、C 言語やシェルスクリプトでソフトウェアを開発していて気になった時にどうぞ。「POSIX の標準規格がわからない。SUS ってなに？POSIX との関連は？」という方は後半の[関連知識](#関連知識)を参照してください。シェルコマンド一覧については「[POSIX コマンド一覧 + SUS コマンド一覧 完全版](https://qiita.com/ko1nksm/items/ad88974b48e91d0289a2)」で全てをまとめています。

## C言語API一覧 と コマンド一覧

C 言語 API とシェルコマンドの一覧は Single UNIX Specification の [Interface Tables](https://unix.org/apis.html) で一覧が記載されています。これを参照すれば OK というだけの話なのですが、何が書かれているかを簡単にまとめました。

### SUSv2 Interface Tables より

1997 年 SUSv2 (UNIX98) としてリリースされたものです。標準化当初の POSIX の「C 言語 API」（リアルタイム拡張、スレッド拡張含む）と「シェルコマンド」のリストが記載されています。一番古い情報を確認したい時に参照すると良いでしょう。

- PDF 版: [Version 2 Interface Tables](https://unix.org/what_is_unix/unixv2.pdf)

| 種類  | 記載されている標準規格                                            |
| ----- | ------------------------------------------------------------ |
| POSIX | POSIX.1 (POSIX.1-1988, POSIX.1-1996), POSIX.2 (POSIX.2-1992) |
| UNIX  | UNIX 95, UNIX 98                                             |
| その他 | ISO C Standard (C89), SVID3, 4.3BSD                          |

リアルタイム拡張とスレッド拡張は POSIX の追加仕様として策定されれたばかりでまだオプションです。POSIX.1 と POSIX.2 は最も機能が少なく、SVID3 と 4.3BSD はそこそこですが、UNIX 95 (SUSv1) と UNIX 98 (SUSv2) はそれらをすべて備えているという感じです。POSIX.1 にリアルタイム拡張 (POSIX.1b) やスレッド拡張 (POSIX.1c) が含まれているので、時代的にもおそらくこのリストは POSIX.1-1996 だと思われます。これらオプション機能を取り除いたものが POSIX.1-1988 となるでしょう。

### SUSv3 Interface Tables より

2001 年に SUSv3 としてリリースされたものです。1121 個の「C 言語 API」と 160 個の「シェルコマンド」に追加して「ヘッダインターフェース」と 372 個の「XCURSES インターフェース」のリストが追加されています。XCURSES は ターミナル用の API で POSIX では標準化されていません。

- PDF 版: [Version 3 Interface Tables](https://unix.org/version3/inttables.pdf)
- HTML 版: [The Single UNIX Specification Version 3 Interface Tables](https://unix.org/version3/apis.html)

| 種類  | 記載されている標準規格                                  |
| ----- | -------------------------------------------------- |
| POSIX | POSIX.2-1992, POSIX.1-1996, POSIX.1-2001 (Issue 6) |
| UNIX  | UNIX 95, UNIX 98, UNIX 03                          |
| その他 | ISO C Standard (C89, C99), SVID3, 4.3BSD           |

POSIX に SUS が統合されました。それに伴い POSIX の標準仕様が大幅に追加されています。そのため SVID3 や 4.3BSD は大きく見劣りするようになりました。ただし、元 SUS の部分は XSI オプションとなっている部分があり、未だ UNIX 03 (SUSv3) の方が POSIX.1-2001 よりも多くの標準仕様を必須としています。リアルタイム拡張 (POSIX.1b) やスレッド拡張 (POSIX.1c) はほとんどが未だオプション扱いです。また POSIX で規定されている C 言語から C89 から C99 に変更になりました。

### SUSv4 Interface Tables より

2008 年に SUSv4 としてリリースされたものです。1191 個の「C 言語 API」と 160 個の「シェルコマンド」と 82 個の「ヘッダインターフェース」と 379 個の「XCURSES インターフェース」のリストが記載されています。XCURSES は ターミナル用の API で POSIX では標準化されていません。

- PDF 版: [Version 4 Interface Tables](https://unix.org/version4/GS5_APIs.pdf)

| 種類  | 記載されている標準規格                                                          |
| ----- | -------------------------------------------------------------------------- |
| POSIX | POSIX.2-1992, POSIX.1-1996, POSIX.1-2001 (Issue 6), POSIX.1-2008 (Issue 7) |
| UNIX  | UNIX 95, UNIX 98, UNIX 03, UNIX V7 (XSI extension)                         |
| その他 | ISO C Standard (C89, C99)                                                  |


もはや古くなった情報と判断されたのか SVID3 と 4.3BSD の情報は削除されました。リアルタイム拡張 (POSIX.1b) とスレッド拡張 (POSIX.1c) のオプション機能の多くが必須機能となり UNIX V7 とかなり等しくなりました。POSIX 完全体と言った感じですね。

## 関連知識

最新の POSIX (POSIX-1.2017) は、もともと POSIX として誕生した標準規格に UNIX 認証のための SUS (Single UNIX Specification) が統合した形となっています。

POSIX.1-1998 で 基本的な C 言語 API が誕生しました。その後、拡張機能としてリアルタイム拡張 (POSIX.1b, POSIX.1d, POSIX.1j)、スレッド拡張 (POSIX.1c)、ネットワーク API (POSIX.1g)、シェルとコマンド (POSIX.2-1992) が追加され、それらが POSIX.1-2001 で統合され、と同時に SUS の仕様がオプション機能として追加されました。

そして最新の POSIX.1-2008（の修正版 POSIX.1-2017）ではリアルタイム拡張、スレッド拡張、ネットワーク API のオプションの拡張機能が必須の標準機能になりました。これらのすべての機能は POSIX に準拠（またはほぼ準拠）した Unix / Linux などで特殊なカーネルやハードウェアを必要とせずに使うことができます。（リアルタイム拡張の一部は十分な性能を出すためにリアルタイム OS (RTOS) が必要となる場合があります。）

### POSIX 公開ドキュメントについて

実は POSIX は標準仕様を直接公開していません。POSIX ではなく Open Group が UNIX の認証のための仕様として SUS を公開していました。そして SUS の内容と POSIX が統合した後も Open Group は標準仕様を公開しており、それが POSIX の標準仕様としても参照することができるようになっています。

[The Open Group Base Specifications Issue 7, 2018 edition](https://pubs.opengroup.org/onlinepubs/9699919799/) ・・・ これが最新の POSIX の標準仕様ですが、実際には Open Group のドキュメント (古くは SUS のドキュメント) ということなのです。

### POSIX 標準規格一覧

- **POSIX.1-1988** (POSIX 1003.1-1998, IEEE Std 1003.1-1988)
  - **C 言語 API が標準化**
- POSIX.1b (POSIX 1003.1b, IEEE Std 1003.1b-1993) ・・・ リアルタイム拡張
- POSIX.1c (POSIX 1003.1c, IEEE Std 1003.1c-1995) ・・・ スレッド拡張
- **POSIX.2-1992** (POSIX 1003.2-1992, IEEE Std 1003.2-1992)
  - **シェルとコマンドが標準化**
- **POSIX.1-1996** (POSIX 1003.1-1996, IEEE Std 1003.1-1996)
  - POSIX.1 改訂、POSIX.1b, POSIX.1c 含む
- POSIX.1d (POSIX 1003.1d, IEEE Std 1003.1c-1999) ・・・ 追加のリアルタイム拡張
- POSIX.1j (POSIX 1003.1j, IEEE Std 1003.1j-2000) ・・・ 高度なリアルタイム拡張
- POSIX.1g (POSIX 1003.1g, IEEE Std 1003.1g-2000) ・・・ ソケット・ネットワークAPI
- **POSIX.1-2001** (POSIX 1003.1-2001, IEEE Std 1003.1-2001)
  - **大規模改訂、上記のすべてが統合**
  - POSIX.1-2003、POSIX.1-2004 ・・・ 技術的ミスの修正版
- **POSIX.1-2008** (POSIX 1003.1-2008, IEEE Std 1003.1-2001)
  - **大規模改訂、拡張機能の多くが標準機能へ**
  - POSIX.1-2013, POSIX.1-2016, POSIX.1-2017 ・・・ 技術的ミスの修正版
- **POSIX.1-202x** **3 回目の大規模改訂（予定）**

POSIX.1-2001 は SUS と統合されたので、この内容は Open Group が公開しているドキュメントとして参照することができます。しかしこれ以前の情報は POSIX が無料公開していないので調べるのは大変です。

### SUS (Single UNIX Specification)

- UNIX 95 (SUSv1) ・・・ XPG4v2 ベース (POSIX に近い）
- UNIX 98 (SUSv2) ・・・ XPG5 ベース (POSIX に近い）
- UNIX 03 (SUSv3) ・・・ POSIX.1-2001 (Issue 6) と同一（統合されました）
- UNIX V7 (SUSv4) ・・・ POSIX.1-2008 (Issue 7) と同一

XPG1 〜 XPG3 は SVID3 (System V 系）と 4.3BSD (BSD 系）をあわせたようなもので、元々は POSIX よりも広い範囲を扱っていました。XPG4 から POSIX ベースとなり、徐々に POSIX 統合に向けてインターフェースが調整されて、UNIX 03 (SUSv3) で POSIX.1-2001 (Issue 6) と統合されました。統合されたので内容は同じなのですが、SUS では XSI (X/Open System Interface) オプションが必須であるという違いがあります。XPG (X/Open Portability Guide) は Open Group の前身である X/Open が策定していた仕様です。Issue の番号と XPG の番号は一致しています。（例 XPG4v2 = Issue 4, Version 2、XPG6 = Issue 6）

### Open Group ドキュメントへのリンク集

- 1994: The Single UNIX Specification (SUSv1) [PDF]
  - [System Interface Definitions, Issue 4, Version 2](https://pubs.opengroup.org/onlinepubs/009656599/toc.pdf) (XBD)
  - [Commands and Utilities Issue 4, Version 2](https://pubs.opengroup.org/onlinepubs/009656399/toc.pdf) (XCU)
  - [System Interfaces and Headers Issue 4, Version 2](https://pubs.opengroup.org/onlinepubs/9695969499/toc.pdf) (XSH)
  - [X/Open Curses Issue 4, Version 2] (https://pubs.opengroup.org/onlinepubs/009638999/toc.pdf) (XCURSES)
  - [Networking Services
Issue 4](https://pubs.opengroup.org/onlinepubs/009656199/toc.pdf) (XNS)
- 1997: [The Single UNIX Specification, Version 2](https://pubs.opengroup.org/onlinepubs/7908799/) (SUSv2)
- 2001: The Open Group Base Specifications Issue 6 (SUSv3)
  - 2001 edition (POSIX.1-2001)
  - 2003 edition (POSIX.1-2003)
  - [2004 edition (POSIX.1-2004)](https://pubs.opengroup.org/onlinepubs/009695399/) 
- 2008: The Open Group Base Specifications Issue 7 (SUSv4)
  - [2008 edition (POSIX.1-2008)](https://pubs.opengroup.org/onlinepubs/9699919799.2008edition/)
  - [2013 edition (POSIX.1-2013)](https://pubs.opengroup.org/onlinepubs/9699919799.2013edition/)
  - [2016 edition (POSIX.1-2016)](https://pubs.opengroup.org/onlinepubs/9699919799.2016edition/)
  - [2018 edition (POSIX.1-2017)](https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/)

## 関連記事

- [POSIXとUnix関連の標準規格と歴史年表 (IEEE, SVID, XPG, SUS)](https://qiita.com/ko1nksm/items/c79f802742e0c3be066d)
- [POSIX コマンド一覧 + SUS コマンド一覧 完全版](https://qiita.com/ko1nksm/items/ad88974b48e91d0289a2)
- [真の UNIX 標準規格 System V Interface Definition (SVID) について](https://qiita.com/ko1nksm/items/7d75a700ef1be2722372)