POSIX(ポジックス)は、UNIX系OSのAPIとシェル・コマンドの振る舞いを揃えるための標準規格です。わかりやすく言えば「この関数とコマンドはどのOSでも同じ意味で動く」という約束の一覧です。LinuxとmacOSが共通して実装している範囲に収めれば、両者の間でソースコードの書き直しを減らせます。本記事では現行版の中身、ヘッダー別のAPI一覧、「POSIX準拠」「POSIX互換」の4つの使われ方、組み込み向けのプロファイル、手元の環境が対応する版の確かめ方を説明します。コマンドとCのコード例は、2026年11月7日に macOS 26.6.2 と Docker 上の Debian 13・Alpine Linux で実行した結果です。
まとめ:POSIXの要点
POSIXは Portable Operating System Interface の略で、IEEE Std 1003.1 として規格化されています。現行版は2024年6月14日に公開された POSIX.1-2024(The Open Group Base Specifications Issue 8)で、同じ内容の国際規格 ISO/IEC/IEEE 9945:2026 が2026年3月に発行されました。
規格が定めるのはアプリケーションから見たインタフェースだけです。open・fork・pthread_create といったC言語の関数、sh の文法、ls や grep などのユーティリティが対象で、カーネルの作りやGUI、パッケージ管理は対象外です。
「POSIX準拠」は、POSIX認証、UNIX認証、認証なしで規格に沿って実装している状態のどれかを指します。POSIX認証の登録製品は INTEGRITY や VxWorks 7 などの組み込みOSで、LinuxディストリビューションはPOSIX認証にもUNIX認証にも登録されていません。それでもLinuxは glibc や musl を通じて、実用上POSIXのAPIの大半を備えています。
getconf が返す版は、macOS 26.6.2 で 200112(2001年版)、Debian 13 と Alpine で 200809(2008年版)でした。2024年版の値 202405 を返す環境はまだ手元に無く、新しい関数やコマンドは実装の有無を個別に確かめる必要があります。
POSIXとは|IEEE Std 1003.1が定めるOSインタフェースの標準規格
POSIXはIEEEの商標で、IEEE Std 1003.n と ISO/IEC 9945 からなる規格群を指します。もとは1988年の IEEE Std 1003.1-1988 だけを指す名前でしたが、現在は規格群全体の呼び名です。単に「POSIX」と言った場合は、中核の POSIX.1(IEEE Std 1003.1)を指すのが普通です。
POSIXの読み方と名前の由来
POSIX FAQ(The Open Group)によると、名前はリチャード・ストールマンが提案したもので、発音は「pahz-icks, as in positive, not poh-six」とされています。positive の「pos」と同じ音で、「ポーシックス」とは読まないという意味です。日本語では「ポジックス」と表記するのが一般的です。
POSIX.1-2024に至る版の変遷
POSIX.1はおよそ10年ごとに大きく改訂されてきました。各版の値は <unistd.h> のマクロ _POSIX_VERSION に入り、この値で環境がどの版を名乗っているかが分かります。
| 版 | 公開 | 主な内容 | _POSIX_VERSION |
|---|---|---|---|
| IEEE Std 1003.1-1988 | 1988年9月30日 | 最初のPOSIX.1 | 198808L |
| POSIX.1-1990(ISO/IEC 9945-1:1990) | 1990年 | 国際規格として発行 | 199009L |
| IEEE Std 1003.1b-1993 | 1993年 | リアルタイム拡張 | - |
| IEEE Std 1003.1c-1995 | 1995年 | スレッド(pthreads) | - |
| POSIX.1-2001 | 2001年 | SUSと統合 | 200112L |
| POSIX.1-2008 / 2017 | 2008年 / 2018年 | 2017年版は正誤反映 | 200809L |
| POSIX.1-2024(Issue 8) | 2024年6月14日 | 現行版 | 202405L |
| ISO/IEC/IEEE 9945:2026 | 2026年3月 | Issue 8の国際規格版 | - |
2017年版(The Open Group では Issue 7, 2018 edition)は値が200809Lのまま変わっていません。改訂作業は IEEE・The Open Group・ISO/IEC の3者による Austin Group が担い、9945:2026 の発行もAustin Group のページで告知されています。
C言語の規格・SUSとの関係
Cの関数を定める規格は3層の入れ子になっています。ISO C(C17など)が printf や malloc のような言語共通の関数を定め、POSIX.1 がその上に fork や open などOSに依存する関数を足し、The Open Group の Single UNIX Specification(SUS)がさらに X/Open Curses などを加えます。つまり ISO C ⊂ POSIX.1 ⊂ SUS の関係です。
2024年版ではコンパイラを呼ぶユーティリティも C17 に合わせて改められ、ユーティリティ索引から c99 が無くなりc17が入りました。規格の説明では「ISO/IEC 9899:2018 standard」への整合のために Issue 8 で初めて追加されたとされています。ただし手元の macOS 26.6.2 にあるのは /usr/bin/c99 で、c17 はありませんでした。SUSとUNIX商標の関係はUnixとは?Linuxとの違い・POSIXと認証UNIXの実際から移行判断まで実装者向けに解説で扱っています。
POSIX.1-2024の中身|4巻の構成と規格の対象外
POSIX.1-2024は pubs.opengroup.org で無償公開されており、次の4巻で構成されています。
| 巻 | 定める内容 | 例 |
|---|---|---|
| Base Definitions | 用語、ヘッダー、環境変数、正規表現 | <unistd.h>、PATH、BRE/ERE |
| System Interfaces | Cから呼ぶ関数 | open、fork、pthread_create |
| Shell and Utilities | shの文法とコマンド | case文、ls、grep、find |
| Rationale | 規定の理由(参考) | 削除・追加の経緯 |
Shell and Utilities 巻はコマンドのオプションまで定めています。たとえば ls の -a は名前がピリオドで始まるものを含む全項目を出し、-A はそこから「.」と「..」だけを除きます。どちらも POSIX の ls に規定されているので、-A もGNU版だけの拡張ではありません。
正規表現の BRE(基本正規表現)と ERE(拡張正規表現)、[[:alpha:]] のような文字クラスは Base Definitions で定義されています。grep や sed の記法が言語ごとの正規表現と微妙に違うのはこのためで、方言の比較は正規表現とは?基本記号の読み方と言語ごとの方言・ReDoS対策を実装目線で解説にまとめています。
POSIX.1-2024で追加・削除された関数とコマンド
Issue 8では、各OSが個別に実装して広く使われていた機能が取り込まれ、使われなくなったものが外されました。
- 追加された関数:strlcpy・strlcat(宛先バッファの全体サイズを指定する文字列のコピーと連結)、reallocarray(乗算オーバーフローを検査する再確保)、ppoll、posix_getdents、_Fork、gettext など
- 追加されたユーティリティ:readlink、realpath、timeout、gettext、ngettext、msgfmt、xgettext(Rationale の新規ユーティリティ一覧に載る7個。c99 に代わる c17 は前述のとおり別に入りました)
- 削除されたユーティリティ:fort77 と、qsub・qstat などバッチ処理の q で始まる11個
追加分の一覧はShell and Utilities 巻の Rationaleに載っています。realpath と timeout は2017年版に無かったため、これまでは使うと移植性が保証されませんでした。2024年版でこの2つは標準になりましたが、実装が追いついているとは限りません。手元では Debian 13 と Alpine に両方ありましたが、macOS 26.6.2 には realpath だけがあり、timeout はありませんでした。
POSIXが規定しない範囲
POSIXが揃えるのはソースコードの互換性で、バイナリの互換性ではありません。同じCのコードでも、Linux向けにビルドした実行ファイルはmacOSでは動きません。次のものも規格の外にあります。
- カーネルの構造:ある関数をシステムコールで実装するか、ライブラリ内で実装するかは実装者の自由です。
- GUI、パッケージ管理、サービス管理(systemd や launchd)
- OS固有の高性能なAPI:Linuxの epoll・inotify、macOSとBSDの kqueue
POSIX APIの一覧|ヘッダー別の代表的な関数
System Interfaces巻の関数のうち、実務でよく使うものをヘッダー別に整理すると次のとおりです。
| ヘッダー | 分野 | 代表的な関数・マクロ |
|---|---|---|
| <unistd.h> | プロセス・入出力 | fork、execvp、read、write、close、sysconf |
| <fcntl.h> | ファイルを開く | open、openat、fcntl |
| <sys/stat.h> | 属性・パーミッション | stat、chmod、mkdir、umask |
| <dirent.h> | ディレクトリ | opendir、readdir、posix_getdents |
| <sys/wait.h> | 子プロセスの回収 | waitpid、WIFEXITED |
| <spawn.h> | プロセス生成 | posix_spawn、posix_spawnp |
| <signal.h> | シグナル | sigaction、kill、sigprocmask |
| <pthread.h> | スレッド・排他 | pthread_create、pthread_mutex_lock |
| <sys/socket.h> | ソケット | socket、bind、connect、accept |
| <poll.h> | 多重待ち | poll、ppoll |
| <time.h> | 時刻 | clock_gettime、nanosleep |
| <regex.h> | 正規表現 | regcomp、regexec |
各関数の正確な仕様は、POSIX.1-2024 のSystem Interfaces 巻の関数索引から関数名ごとのページを引くのが確実です。ソケットの使い方はソケットとは?Pythonで作って動かすTCP・UDP・UNIXドメインの実装入門で扱っています。
POSIX APIで子プロセスを起動するCのコード例
fork で子プロセスを作り、execlp で uname を実行し、waitpid で終了コードを受け取る最小の例です。先頭の _POSIX_C_SOURCE は機能テストマクロで、「POSIX.1-2008の範囲の宣言を使う」とコンパイラに伝えます。
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void) {
printf("_POSIX_VERSION=%ld\n", (long)_POSIX_VERSION);
printf("sysconf(_SC_VERSION)=%ld\n", sysconf(_SC_VERSION));
fflush(stdout);
pid_t pid = fork();
if (pid == -1) { perror("fork"); return 1; }
if (pid == 0) {
execlp("uname", "uname", "-s", (char *)NULL);
perror("execlp");
_exit(127);
}
int status;
if (waitpid(pid, &status, 0) == -1) { perror("waitpid"); return 1; }
if (WIFEXITED(status))
printf("child exit=%d\n", WEXITSTATUS(status));
return WIFEXITED(status) ? WEXITSTATUS(status) : 1;
}
macOS 26.6.2 で cc -std=c11 -Wall -Wextra -pedantic を付けてビルドすると警告は出ず、パイプへ出力した実行結果は次のとおりでした。
_POSIX_VERSION=200112
sysconf(_SC_VERSION)=200112
Darwin
child exit=0
fork の直前の fflush は省略しないでください。出力先がパイプやファイルのとき、printf の内容は親プロセスのバッファに溜まり、終了時まで書き出されません。fflush を消した版をパイプとファイルへ出力すると、どちらも子の出力した Darwin が最初の行に来ました。子が exec せずに exit で終わる作りでは、複製されたバッファの内容が二重に出力されることもあります。
POSIX準拠とPOSIX互換の意味|認証製品と実装上の準拠
「POSIX準拠」「POSIX互換」という言葉は、次の意味で使われています。資料を読むときは、どの意味で書かれているかを区別してください。
- POSIX認証:IEEE と The Open Group が運営する「POSIX: Certified by IEEE and The Open Group」の試験に通った製品。登録された製品標準と構成の範囲で適合を示します。System Interfacesのみの認証やPSE52の認証もあり、POSIX全体への適合を一律に保証するものではありません。
- UNIX認証:The Open Group の Open Brand 制度で、SUS に基づく製品標準(UNIX 03 や UNIX V7)への適合を登録した製品。UNIXの商標を使えるのはこちらで、POSIX認証だけでは名乗れません。
- 準拠を目標に実装:試験は受けていないが、規格に沿って作っている。glibc は公式に「POSIX.1-2008 を含む関連規格に従うことを目標とする」と説明しています。
- 一部互換:主要なAPIやコマンドを備えるが、網羅はしていない。
POSIX認証の登録製品|組み込みOSが中心
POSIX Certification Registerに載っている製品は、2026年11月7日時点で次の7つです。
| 製品 | 企業 | 対象の規格 | 初回登録 |
|---|---|---|---|
| INTEGRITY 5.0 | Green Hills Software | 1003.1-2003 | 2004年 |
| INTEGRITY PC | Green Hills Software | 1003.1-2003 | 2005年 |
| INTEGRITY 10.0 | Green Hills Software | 1003.1-2003 | 2010年 |
| INTEGRITY 11.0 | Green Hills Software | 1003.1-2003 | 2012年 |
| VxWorks 7 | Wind River Systems | PSE52(1003.13-2003) | 2019年 |
| ZTE Automotive OS V3.0 | ZTE | PSE52(1003.13-2003) | 2022年 |
| Xiaomi Vela OS V5.0 | Xiaomi | PSE52(1003.13-2003) | 2025年 |
組み込み・リアルタイム用途の登録が中心ですが、INTEGRITY PCの登録上の用途はDesktopです。対象の規格はいずれも2003年版です。2024年版を対象にした登録はまだなく、Linux・macOS・Windows などの汎用OSも載っていません。
UNIX認証の登録と主要OSのPOSIX対応状況
UNIX認証は The Open Group の Open Brand の登録で確かめます。2026年11月7日に確認した状況は次のとおりです。
| OS | UNIX認証 | 実態 |
|---|---|---|
| macOS 26 Tahoe | UNIX 03(2025年8月29日登録) | Apple silicon版とIntel版 |
| macOS 27 Golden Gate | 登録なし | 2026年9月14日公開 |
| IBM AIX 7 | UNIX V7 / UNIX 03 | V7登録は7.2 TL5以降 |
| HP-UX 11i V3 | UNIX 03 | B.11.31以降 |
| Linux | 登録なし | glibc・muslで大半を実装 |
| FreeBSD | 登録なし | 大半を実装 |
| Windows | 登録なし | WSL上のLinuxで利用 |
macOS の扱いは、どのページを見るかで違って見えます。Apple社の登録ページには macOS 26.0 Tahoe と 15.0 Sequoia の UNIX 03 登録が並んでいますが、UNIX 03 の製品一覧ページには、2026年11月7日時点で Apple の行がありません。macOS 27 の登録はどちらのページにも無く、直近6か月の新規登録(2026年10月9日までの分)も0件でした。「macOS はUNIX認証済み」と書く資料は、対象の版を確かめてから引用してください。
UNIX V7 の登録は AIX の1件だけです。製品一覧のHTMLには Solaris や Huawei EulerOS 2.0 の行がコメントとして残っていますが、画面に表示される一覧には含まれていません。Linux と FreeBSD は認証を受けていませんが、サーバーで使うPOSIX APIはほぼ揃っています。違いが出るのは認証の有無よりも、GNU拡張やOS固有APIへの依存です。各OSの詳細はLinuxとは?仕組み・ディストリビューション・サーバー用途を実装目線で解説【2026年版】とFreeBSDとは?Linuxとの違い・ZFS/jail/bhyveの実装から採用判断まで実装者向けに解説を参照してください。
WindowsのPOSIXサブシステムとWSL
Windows NT 4.0 と Windows 2000 には、POSIXアプリケーションを動かすための環境サブシステムがありました。Microsoft のセキュリティ情報MS04-020には「Windows XP and Windows Server 2003 do not contain the POSIX subsystem」と書かれています。その後の Subsystem for UNIX-based Applications(SUA)も、Windows Server 2012 で非推奨となり、2012 R2 で削除されました。
現在の選択肢は WSL です。WSL 1 は Linux のシステムコールを Windows 側で変換する方式でしたが、既定の WSL 2 は軽量VMの中で Microsoft が提供する Linux カーネルを動かします。WSL 2 でPOSIX APIを使うとき、実際に動いているのはLinuxです。WSL以外では、cygwin1.dll がPOSIX APIの多くを提供する Cygwin があり、ソースから再ビルドすればWindowsのネイティブプロセスとして動かせます。構築手順はWSLで開発環境を構築する手順|.wslconfig調整とDocker連携・肥大化の対処にまとめています。
組み込みRTOSのPOSIX|IEEE 1003.13のPSE51〜PSE54
マイコンで動くRTOSは、プロセスもファイルシステムも持たないことがあり、POSIX.1の全部を実装するのは現実的ではありません。そこで IEEE 1003.13-2003 は、機能を段階的に足した4つのプロファイルを定めました。
| プロファイル | 名称 | 想定する機器 |
|---|---|---|
| PSE51 | Minimal Realtime System | 単一プロセス・ファイルなし |
| PSE52 | Realtime Controller System | PSE51+簡易ファイルシステム |
| PSE53 | Dedicated Realtime System | 複数プロセス |
| PSE54 | Multi-Purpose Realtime System | 汎用OSに近い構成 |
上の認証製品のうち VxWorks 7 などが取得しているのは PSE52 です。Zephyr のドキュメントは、1003.13-2003 のプロファイルは現在 inactive(参照用)で、その考え方は POSIX.1-2017 のオプションとオプショングループに引き継がれていると説明しています。Zephyr 自体は IEEE 1003.1-2017 のサブセットを実装しており、公式の例は prj.conf に CONFIG_POSIX_API=y を書いて nanosleep などを使っていますが、同じページはこの設定を凍結済みのレガシーとし、新しいアプリでは使わず CONFIG_POSIX_AEP_CHOICE_PSE51 のようなサブプロファイルやオプション単位で設定するよう求めています。
組み込みでPOSIXを選ぶ利点は、Linuxで書いて試したライブラリをRTOSへ持ち込めることです。ただしZephyrのようにアプリを単一プロセスとして扱うRTOSでは、fork に依存するコードをそのまま移植できません。QNX Neutrinoのように fork を提供するRTOSもあるため、対応状況は製品ごとに確認します。移植前に、使っている関数がそのRTOSのプロファイルに含まれるかを一覧で突き合わせてください。RTOSの比較はRTOSとは?リアルタイムOSの仕組み・主要製品の比較と採用判断を実装者目線で解説で扱っています。機器側のOS選定からクラウド連携までまとめて相談したい場合は、AI/IoTソリューションで支援しています。
手元の環境が対応するPOSIX版を確かめる方法
OSが名乗っているPOSIXの版は、getconf コマンドで確認できます。
$ getconf _POSIX_VERSION
200112
$ getconf _XOPEN_VERSION
600
$ getconf PATH
/usr/bin:/bin:/usr/sbin:/sbin
上は macOS 26.6.2 での結果です。SDKの <sys/unistd.h> でも _POSIX_VERSION は 200112L と定義されていました。同じコマンドを Docker の debian:13 と alpine:3 のイメージ(取得時点で Debian 13.7・Alpine 3.24.2)で実行した結果と並べると次のようになります。タグの参照先は更新されるので、再検証するときはOSの詳細版も記録してください。
| 環境 | _POSIX_VERSION | /bin/sh | realpath | timeout |
|---|---|---|---|---|
| macOS 26.6.2 | 200112 | bash 3.2 | あり | なし |
| Debian 13.7(glibc 2.41) | 200809 | dash | あり | あり |
| Alpine 3.24.2(musl 1.2.6) | 200809 | BusyBox | あり | あり |
macOS 26 は UNIX 03 に登録されていますが、UNIX 03 は Single UNIX Specification Version 3 に基づく認証なので、2001年版の値を返すことと矛盾しません。_XOPEN_VERSION の 600 も SUSv3 を表す値です。つまり「UNIX認証済み=最新のPOSIXに対応」ではありません。Linuxのディストリビューションや版そのものを調べる方法はLinuxのバージョン確認コマンド|OSはos-release、カーネルはuname -rで見るにまとめています。
getconf PATH は、POSIXのユーティリティが揃ったPATHを返します。環境変数PATHが書き換えられた環境でも標準のコマンドを確実に見つけたいとき、スクリプトの冒頭で使えます。環境変数の扱いは環境変数とは?Linux・Windowsの設定方法とDocker・CIでの受け渡しで解説しています。
Cのコードで _POSIX_C_SOURCE に 200809L などの値を定義すると、ヘッダーがどの版の機能を公開するかを指定できます。これは公開する宣言を制御する仕組みで、規格外のAPIを使っていないことを検査する機能ではありません(glibcのマニュアルも、厳密な規格適合の確認には使えないと注意しています)。値を上げても、OSが実装していない関数が使えるようになるわけではないので、posix_getdents のような2024年版の関数は対象OSのmanページで実装を確かめてから使ってください。
POSIXの範囲で書くべき場面と書かなくてよい場面
移植性を常に最優先する必要はありません。判断の基準は「そのコードが、動作を確認していない環境で実行されるかどうか」です。
#!/bin/sh のスクリプトで通用するPOSIXの文法の範囲
シバンに #!/bin/sh と書いたスクリプトは、Debian や Ubuntu では dash で、macOS では POSIX モードの bash 3.2 で、Alpine では BusyBox の sh で動きます。bash 固有の [[ ]] を使うと、bash では通っても dash では失敗します。
#!/bin/sh
name="posix"
if [[ $name == p* ]]; then
echo "match"
fi
$ bash bashism.sh
match
$ dash bashism.sh
bashism.sh: 3: [[: not found
$ echo $?
0
注意すべきなのは、dash がエラーを出してもスクリプトの終了コードが0のままになる点です。if の条件が失敗として扱われ、分岐が静かに飛ばされるだけなので、CIのジョブは成功扱いになります。Debian 13 のコンテナの sh でも同じ結果でした。POSIXの範囲では case 文で書きます。
#!/bin/sh
name="posix"
case $name in
p*) echo "match" ;;
esac
この書き方なら dash でも match が出力されました。配列や [[ ]] がどうしても必要なら、シバンを #!/usr/bin/env bash にして、bash を前提にしていることをファイル自体に明記してください。
OS固有APIを使ってよい場面
Linux上のコンテナでしか動かず同時接続が多いサーバーなら、poll ではなく epoll を第一候補にします。poll は呼び出しのたびに監視対象の全件を配列で渡す設計で、epoll のmanページは epoll を多数のファイルディスクリプタに対応できるAPIとして説明しています。どちらを選ぶかは、想定する接続数で両方を計測して決めます。epoll を呼ぶ処理は共通のインタフェースの裏に閉じ込め、残りはPOSIXの範囲で書いておけば、macOSの開発機では kqueue による実装に差し替えられます。エッジトリガーの扱いなど両者の動作の違いは、それぞれの環境でテストして確かめてください。
避けるべきなのは、開発機のmacOSとCIのLinuxで、GNU版とBSD版のコマンドの違いに気づかないまま混在させることです。代表例は sed -i です。GNU版は拡張子の引数を省略できますが、BSD版は sed -i '' のように空文字列を渡す必要があります。POSIX.1-2024 の sed が定めるオプションは -E・-n・-e・-f で、-i はありません。両方の環境で動かすスクリプトでは、sed 's/a/b/' file > file.tmp && mv file.tmp file のように、一時ファイルへの書き出しが成功したときだけ mv で置き換えます。この方法では新しいファイルが元のファイルと入れ替わるため、パーミッションや所有者、ハードリンクを保つ必要があるファイルでは、置き換える前にそれらの扱いを確認してください。timeout のように2024年版で入ったコマンドも、macOS 26.6.2 には無いので同じ注意が要ります。
よくある質問
POSIXは何と読みますか?
日本語では「ポジックス」と読むのが一般的です。POSIX FAQ(The Open Group)には、英語の発音は positive の「pos」と同じ「pahz-icks」と書かれています。
POSIX標準の現行版はどれですか?
2024年6月14日に公開された POSIX.1-2024(IEEE Std 1003.1-2024、The Open Group Base Specifications Issue 8)です。<unistd.h> の _POSIX_VERSION の値は 202405L で、国際規格版の ISO/IEC/IEEE 9945:2026 も2026年3月に発行されています。
LinuxはPOSIX準拠ですか?
LinuxディストリビューションはPOSIX認証にもUNIX認証にも登録されていません。一方で glibc は POSIX.1-2008 を含む関連規格に従うことを目標としており、Debian 13 と Alpine の getconf _POSIX_VERSION はどちらも 200809 を返しました。実用上はPOSIXのAPIの大半を使えます。
WindowsでPOSIXのプログラムは動きますか?
Windows 本体の旧POSIXサブシステムとSUAは提供が終わっています。現在は WSL 2 が軽量VM上で動かすLinuxの上で実行するか、Cygwin を使ってソースから再ビルドする方法があります。
POSIX APIの一覧はどこで確認できますか?
The Open Group が pubs.opengroup.org で公開している POSIX.1-2024 の System Interfaces 巻(関数)と Shell and Utilities 巻(コマンド)に、全件が掲載されています。本記事では、実務でよく使う関数をヘッダー別の表にまとめています。