本記事では、POSIXについて解説します。
POSIXとは
POSIX (Portable Operating System Interface) は、UNIX系OS間での移植性と互換性を高めるために開発された一連の標準規格です。POSIXはIEEE1 (Institute of Electrical and Electronics Engineers) によって制定され、IEEE Std 1003 で定められています。
POSIXでは、OSの機能を呼び出すためのAPI2 (Application Programming Interface) が定義されています。POSIXに準拠しているOSでは、同じAPIを使用してOSの機能を使用することができます。これにより、POSIXのAPIを使用しているアプリケーションにおいて、異なるOS間での移植性と互換性が向上します。
アプリケーションはPOSIXのAPIを使用して、ファイル操作やプロセス管理、ネットワーク通信など様々なOSの機能を使用できます。
POSIXの利点
POSIXには、以下のような利点があります。
- 移植性・互換性の向上:POSIX準拠のOSでは同じAPIが使用できるので、同じソースコードを異なるOS上で容易にビルドし、実行することができます。
- 安定性と信頼性:POSIXは、厳格な標準に基づいているため、APIは高い安定性と信頼性を提供します。
- 学習コスト低減:POSIXには長い歴史があり、ドキュメント等が豊富に存在します。また、POSIXのAPIは一度学習すれば、他のPOSIX準拠のOSでプログラミングするときにも同じAPIを使用できるため、学びなおす必要がありません。
主要な特徴と機能
POSIXのAPIは、大きくC言語のAPIとシェル3のAPIに分類されます。
POSIXのAPIの一覧は、「The Open Group Base Specifications Issue 7, 2018 edition」で確認できます。
C言語のAPI
POSIXでは、OSのシステムレベルの機能にアクセスするための一連のC言語のAPIを定義しています。POSIXで定義されているC言語のAPIをカテゴリ別に紹介します。
ファイルとディレクトリの操作
ファイルとディレクトリを操作するための関数を定義しています。
関数名 | 説明 |
open() | ファイルをオープンし、ファイルディスクリプタを作成します。 |
close() | ファイルディスクリプタをクローズします。 |
プロセス管理
プロセスを管理するための関数を定義しています。
関数名 | 説明 |
fork() | 子プロセスを生成します。 |
exec() | 現在のプロセスを指定したプログラムに置き換えます。 |
シグナル処理
シグナルを扱うための関数を定義しています。
関数名 | 説明 |
signal() | 特定のシグナルに対するハンドラ(関数)を設定します。 |
pause() | シグナルを受信するまでプロセスを停止させます。 |
スレッド管理
スレッドを管理するための関数を定義しています。
関数名 | 説明 |
pthread_create() | 新しいスレッドを生成します。 |
pthread_join() | スレッドの終了を待ちます。 |
ネットワーク通信
ネットワーク通信を管理するための関数を定義しています。
関数名 | 説明 |
socket() | ソケットを生成します。 |
send() | ソケット経由でデータを送信します。 |
PythonなどC言語以外の言語でも、ファイル操作やプロセス管理などOSのシステムレベルの機能を使用するライブラリを使用できますが、内部的にはC言語のAPIを使用している場合が多いです。(※WindowsなどPOSIX準拠でないOSでは、独自のAPIを呼び出しています。)
シェルのAPI
POSIXでは、シェルコマンドおよびユーティリティを定義しています。POSIXで定義されているシェルコマンドおよびユーティリティをカテゴリ別に紹介します。
ファイルとディレクトリの操作
ファイルやディレクトリを操作するためのコマンドを定義しています。
コマンド名 | 説明 |
ls | ファイルを一覧表示します。 |
mkdir | ディレクトリを作成します。 |
テキスト処理
テキストファイルを操作するコマンドを定義しています。
コマンド名 | 説明 |
grep | 特定の文字列を含む行を抽出します。 |
diff | テキストファイルの差分を出力します。 |
システム情報の管理
システム情報の表示や設定を行うコマンドを定義しています。
コマンド名 | 説明 |
date | 現在の時刻の取得や設定を行います。 |
top | プロセスの状態を出力します。 |
ネットワーク情報
ネットワーク関連情報の確認や設定を行うコマンドを定義しています。
コマンド名 | 説明 |
grep | 特定の文字列を含む行を抽出します。 |
diff | テキストファイルの差分を出力します。 |
セキュリティ関連
セキュリティ関連の確認や設定を行うコマンドを定義しています。
コマンド名 | 説明 |
ping | ネットワークの疎通状態を確認します。 |
ifconfig | ネットワークの状態や設定を確認します。 |
POSIX準拠のOS
IEEEからPOSIX認証を受けており、POSIXに準拠している主要なOSを以下の表に示します。
OS名 | 説明 |
macOS | Appleが開発するデスクトップPC向けのUNIXベースのOS。 |
AIX | IBMが開発するUNIXベースのOSで、特定のエンタープライズ環境で使用されています。 |
HP-UX | HPE(Hewlett Packard Enterprise)が開発するUNIXベースのOSで、特定のエンタープライズ環境で使用されています。 |
Solaris | Oracleが開発するUNIXベースのOSで、特定のエンタープライズ環境で使用されています。 |
また、IEEEからPOSIX認証を受けていないが、POSIXに概ね準拠しているOSを以下の表に示します。
OS名 | 説明 |
Linux | リーナス・トーバルズが開発したLinuxカーネルを使用しているUNIXライクのOSで、UbuntuやCentOSなど、様々なディストリビューションが存在します。 |
BSD | カリフォルニア大学バークレー校で開発された、UNIXベースのOSで、FreeBSD、NetBSD、OpenBSDなど、様々なディストリビューションが存在します。 |
WindowsはPOSIX準拠のOSではありませんが、WSL (Windows Subsystem for Linux)や Cygwin を使用することでPOSIXのAPIを使用することができます。
歴史
1970年代から1980年代にかけて、UNIXは非常に人気がありましたが、その成功は同時に大きな問題を引き起こしました。
UNIXは多くの大学、研究所、企業で異なるハードウェア上で実装されたため、各UNIXは独自の拡張機能や変更を加えていました。この結果、UNIX間での互換性が低下し、アプリケーションの移植性に大きな問題が生じました。アプリケーションがあるバージョンのUNIXで動作しても、他のバージョンで動作する保証がなかったのです。
この問題に対処するため、1985年にIEEEは、UNIXの互換性を向上させるための標準化プロジェクトを開始しました。このプロジェクトは、「Portable Operating System Interface for UNIX」の略で「POSIX」と名付けられました。目的は、OSのインターフェースに関する一連の標準仕様を確立し、異なるOS間でアプリケーションの移植が容易になるようにすることでした。
1988年に初版である POSIX.1 (IEEE Std 1003.1-1988) が発表されました。これは、主にプロセス管理、ファイル操作、およびシグナル処理に関するOSのシステムレベルの機能にアクセスするためのC言語APIを定義しています。
1992年には、POSIX.2-1992 (IEEE Std 1003.2-1992) が発表されました。これはPOSIX.2の初版で、シェルコマンドおよびユーティリティのAPIに関する標準を定義しました。
1993年には、リアルタイム拡張が追加された POSIX.1b (IEEE Std 1003.1b-1993) が発表されました。これには、タイマー、優先度スケジューリング、同期メカニズムなどのAPIが追加されました。
1995年には、スレッド拡張が追加された POSIX.1c (IEEE Std 1003.1c-1995) が発表されました。これにより、マルチスレッドアプリケーションの開発が可能になりました。
それ以降も改良版として、2001年には POSIX.1-2001 (IEEE Std 1003.1-2001) 、2008年には POSIX.1-2008 (IEEE Std 1003.1-2008) 、2017年には POSIX.1-2017 (IEEE Std 1003.1-2017) がそれぞれ発表されました。
また、POSIX.2は2003年にPOSIX.1と統合されました。
- 1985年POSIX標準化プロジェクト開始
- 1988年POSIX.1 (IEEE Std 1003.1-1988) を発表
プロセス管理、ファイル操作、およびシグナル処理にアクセスするためのC言語APIを定義。
- 1992年POSIX.2-1992 (IEEE Std 1003.2-1992) を発表
シェルコマンドおよびユーティリティのAPIを定義。
- 1993年POSIX.1b (IEEE Std 1003.1b-1993) を発表
タイマー、優先度スケジューリング、同期メカニズムなどのAPIを追加。
- 1995年POSIX.1c (IEEE Std 1003.1c-1995) を発表
マルチスレッドアプリケーション用のAPIを追加。
- 2001年POSIX.1-2001 (IEEE Std 1003.1-2001) を発表
- 2003年POSIX.2をPOSIX.1に統合
- 2008年POSIX.1-2008 (IEEE Std 1003.1-2008) を発表
- 2017年POSIX.1-2017 (IEEE Std 1003.1-2017) を発表
POSIXには、元々POSIX.1とPOSIX.2が存在しました。 POSIX.1では主にシステムレベルのC言語のAPIを定義しており、POSIX.2では主にシェル及びユーティリティのAPIを定義していました。 現在のPOSIX(POSIX.1)はC言語APIとシェル及びユーティリティのAPIをそれぞれ定義しています。
最後に
POSIXはOSの基本的な概念と機能に関する多くの規格を含んでいます。そのため、POSIXについて学ぶことで、OSに対する理解が深まります。OSに関する知見を増やしたい方は、POSIXについて学んでみることをお勧めします。