1. 概要

このチュートリアルでは、POSIXとは何か、そしてなぜそれが生まれたのかを知ることができます。 次に、POSIXの背後にあるいくつかの歴史とそれがどのように進化したかを見ていきます。 その後、いくつかの重要なPOSIX標準について説明します。

最後に、完全にまたは部分的にPOSIXに準拠しているオペレーティングシステムを確認します。

2. POSIXとは何ですか?

POSIXは、Portable OperatingSystemInterfaceの略です。 これは、オペレーティングシステム間の互換性を維持するためにIEEEによって指定された標準のファミリです。 したがって、 POSIX標準に準拠するソフトウェアは、POSIX標準に準拠する他のオペレーティングシステムと互換性がある必要があります。

そのため、LinuxおよびUnixライクなオペレーティングシステムで使用するツールのほとんどは、ほぼ同じように動作します。 たとえば、 ps コマンドを使用する場合、OpenBSD、Debian、およびmacOSでも同じように動作するはずです。

2.1. 小さな歴史

情報化時代の初期には、プログラマーはさまざまなシステムインターフェイスと環境を備えたオペレーティングシステム用のソフトウェアを作成していました。 したがって、ソフトウェアを他のオペレーティングシステムに移植するには、多くの大幅な調整とコストが必要になります。

この問題を克服するために、POSIXが誕生しました。 POSIXは、元のUNIXの標準化であり、異なるUNIXバリアント間だけでなく、UNIX以外のオペレーティングシステム間でも問題を解決するために1988年に復活しました。

POSIXの作業は、急速に発展しているUNIXシステムインターフェイスを標準化するために1980年代初頭に始まりました。 さまざまなシステムを簡潔に説明しています。 重要なPOSIX.1標準は国際的に受け入れられた標準ISO/IEC 9945-1:1990になり、POSIX.2標準はIEEEStd1003.2-1992として国際的に受け入れられました。

2.2. POSIXバージョン

POSIXが参照する標準のファミリーは、IEEE Std 1003. n-yyyyとして知られています。 n は、IEEEStd1003.1などのバージョン番号に置き換えることができます。 IEEEStd1003.1をPOSIX.1と呼ぶこともできます。 POSIX.1の現在のバージョンはIEEEStd1003.1-2017です。

POSIX 1003.1は、POSIXファミリーの標準が開発された基本標準であり、現在、POSIXの傘下に20を超える標準とドラフトがあります。

POSIX.1は、アプリケーションの移植性、およびプロセスの作成と終了、プロセス環境の操作、ファイルとディレクトリへのアクセス、単純なI/Oなどの基本的なタスクのCインターフェイスとシステムサービスの動作を定義します。

一方、POSIX.2は、コマンドインタープリター、ポータブルシェルプログラミング、ユーザー環境、および関連するユーティリティについて説明しています。 どちらの規格も、既存のUNIXの実践と経験に強く影響されています。

3. POSIX定義の標準

このセクションでは、いくつかの重要なPOSIX標準を見ていきます。 さらに、 Open Group Base SpecificationIssueを詳細なリファレンスとして使用できます。

3.1. C API

POSIXは、C言語の観点から標準を定義しています。 したがって、プログラムは、ソースコードレベルで他のオペレーティングシステムに移植できます。 それでも、標準化された任意の言語で実装することもできます。

POSIX C APIは、さまざまな側面でANSIC標準に加えてさらに多くの機能を追加します。

  • ファイル操作
  • プロセス、スレッド、共有メモリ、およびスケジューリングパラメータ
  • ネットワーキング
  • メモリ管理
  • 正規表現

関数の完全な説明は、POSIX headersで定義されています。

3.2. 一般的な概念

C APIに加えて、POSIXは、ポインター型の初期化や同時実行の安全性など、プログラムを作成するためのルールも追加しました。 また、すでに使用されている場合のメモリ変更の制限など、メモリ同期のルールを適用します。 それとは別に、ディレクトリ保護とファイルアクセスのセキュリティメカニズムについても説明しています。

3.3. ファイル形式

POSIXは、ファイルで使用する文字列のフォーマット、標準出力、標準エラー、および標準入力のルールを定義します。 例として、出力文字列の説明を考えてみましょう。

"<format>", <arg1>, ..., <argN>

形式には、通常の文字、エスケープシーケンス文字、および変換仕様を含めることができます。変換仕様は、指定された引数の出力形式を示し、パーセント記号の後に引数タイプが続きます。

例として、今日の日付を含む文字列を出力するとします。 printf ユーティリティは、POSIXファイル形式の標準に準拠しているため、使用します。

$ printf "Today's Date: %d %s, %d" 18 September 2021
Today's Date: 18 September, 2021

このフォーマットは、 %d %s 、および%dの3つの変換仕様を指定します。 printf ユーティリティは、これらの変換仕様を処理し、引数に置き換えます。

3.4. 環境変数

環境変数は、環境ファイルで定義できる変数であり、ログインが成功するとログインシェルが処理します。 慣例として、変数名には大文字とアンダースコアを含める必要があります。 名前に数字を含めることもできますが、POSIX標準では、名前の先頭に数字を置くことは推奨されていません。

環境変数ごとに、値はポータブル文字セットで定義されている文字列のみにする必要があります。たとえば、ベースユーザーディレクトリの環境変数を次の形式で定義できます。

XDG_BASE_DIRECTORY="/home/user/"

環境変数には好きな名前を付けることができますが、標準ユーティリティの環境変数と競合する名前で独自の環境変数を定義することは避けてください。さらに、準拠する実装は環境変数の大文字と小文字を区別する必要があります名前。 たとえば、名前homeHomeは2つの異なる環境変数です。

私たちの実装は、予約された環境変数を尊重する必要があります。

  • COLUMNは端末画面の幅を定義します。
  • HOME は、ユーザーのホームディレクトリのパス名を定義します。
  • LOGNAME は、ユーザーのログイン名を定義します。
  • LINES は、端末画面でユーザーの優先回線を定義します。
  • PATH は、実行可能ファイルのバイナリコロン区切りパスを定義します。
  • PWD は、現在の作業ディレクトリを定義します。
  • SHELL は、現在使用中のシェルを定義します。
  • TERMは端末タイプを定義します。

3.5. ロケール

ロケールは、ユーザー環境で使用される言語と文化の慣習を定義します。各ロケールは、日時の書式設定、金銭の書式設定、数値の書式設定など、ソフトウェアコンポーネントの動作を定義するカテゴリで構成されます。

プログラムの実装は、Cロケールと同じPOSIXロケールに準拠する必要があります。 プログラムの実装では、現在定義されているロケール環境変数を使用して、一貫性を維持する必要があります。 ロケールが設定されていない場合、実装はPOSIX準拠のロケールを指定する必要があります。

POSIX標準では、カテゴリごとに次の環境変数が定義されています。

  • LC_TYPE文字分類用
  • LC_COLLATE は、文字の順序を定義します
  • LC_MONETARY通貨フォーマット用
  • LC_NUMERIC は、数値をフォーマットします
  • LC_TIME日付と時刻のフォーマット
  • LC_MESSAGES情報メッセージやログなどのプログラムメッセージ用

3.6. キャラクターセット

文字セットは、各文字のコードとビットパターンで構成される文字のコレクションです。 ご存知のように、コンピューターはバイナリのみを理解するため、文字セットはコンピューターが処理できる記号を表します。 そのため、POSIXで定義されているものに準拠した標準の文字セットが必要です。

POSIXでは、実装に少なくとも1つの文字セットとポータブル文字セットを含めることをお勧めします。 文字セットの最初の8つのエントリは、制御文字でなければなりません。 POSIXロケールには、移植可能な文字セットと移植不可能な文字セットの両方から少なくとも256文字を含める必要があります。

3.7. 正規表現

正規表現(RE)は、テキストを検索するための検索パターンを定義する文字列です。 標準CライブラリはREを実装し、バックエンドとしてawk、sed、grepなどのプログラムで使用されます。

POSIX準拠の実装では、基本正規表現(BRE)または拡張正規表現(ERE)を使用できます。 BREはテキストを検索するための基本的な表記法を提供し、EREはより多くの表記法をサポートします。高度なテキスト操作ユーティリティもEREをサポートしますが、ほとんどのPOSIX準拠ユーティリティはBREに大きく依存しています。

さらに、BREとEREの両方にいくつかの要件が適用されます。

  • BREおよびEREは、NUL文字で終わる文字列を操作する必要があります。
  • 文字通りのエスケープシーケンスおよび改行文字は、未定義の結果を生成します。 したがって、私たちのプログラムはそれらを通常の文字として扱う必要があります。
  • POSIXでは、REまたはテキストでの明示的なNUL文字の使用を許可していません。
  • 私たちの実装では、デフォルトで大文字と小文字を区別しない検索を実行できるはずです。
  • REの長さは256バイトを超えてはなりません。

3.8. ディレクトリ構造

ほとんどの主要なLinuxディストリビューションは、 Filesystem Hierarchy Standard (FHS)に準拠しています。 FHSは、構成可能なツリーのようなディレクトリ構造を定義します。 階層の最初のディレクトリはrootディレクトリであり、他のすべてのディレクトリ、ファイル、および特殊ファイルはそこから分岐します。

tree ユーティリティを使用すると、ディレクトリ構造をより正確に把握できます。

$ tree / -d -L 1
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib64 -> usr/lib
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/bin
├── sys
├── usr
└── var

階層は構成可能ですが、プログラムはルートおよび/ devディレクトリの下にファイルまたはディレクトリを作成しないでください。ただし、XDGなどの任意のユーザーディレクトリの下にファイルおよびディレクトリを作成できます。ベースディレクトリ。 さらに、 /tmpディレクトリを使用して一時ファイルとディレクトリを作成することもできます。

3.9. ユーティリティ

UNIX / Linux環境のユーティリティに慣れると、ほとんどのユーティリティが同じように動作することがわかります。 たとえば、 -h オプションは、ほとんどすべてのUNIX/Linuxユーティリティのヘルプテキストを出力することがわかっています。 この一貫性は、POSIXで説明されている規則によるものです。 POSIXは、ユーティリティプログラムの実装方法に関するプログラマー向けのいくつかの規則を定義しています。

POSIXでは、ユーティリティプログラムに次の引数構文を実装することをお勧めします。

utility_name [-a][-b][-c option_argument]
    [-d|-e][-f[option_argument]][operand...] <parameter name>

それを分解しましょう:

  • Utility_name は、ユーティリティの名前の後にオプションと引数が続きます。
  • 角括弧内の項目はオプションであり、省略できます。
  • -aおよび-bは、プログラム機能を有効または無効にするフラグです。
  • -c オプションでは、空白文字を間に挟んだ引数が必要です。
  • パイプで区切られた-dおよび-eオプションは、両方のオプションが相互に排他的であることを指定します。
  • -f オプションは、オプションとオプション引数を空白文字の間に入れずに一緒に配置する必要があることを指定し、引数のないオプションは次の引数をオプションとして扱わないものとします。口論。
  • オペランドは、テキストファイルなど、ユーティリティが処理するものであれば何でもかまいません。
  • オペランドの後の省略記号(…)は、ユーティリティに0個以上のオペランドを入力できることを示します。
  • 山かっこ内の項目は、実際の値に置き換える必要があります。

さらに、ユーティリティで必要なオプションの括弧を省略できます。 多くのオプションを備えた複雑なユーティリティについては、オプションをグループ化できます。

utility_name [-axyDnPo][-l arg][operand]

ユーティリティ構文とは別に、POSIXでは、ユーティリティを実装するときに一連のガイドラインを使用することをお勧めします。

4. オペレーティングシステムとPOSIX準拠

4.1. Linux

完全にPOSIXに準拠したLinuxベースのオペレーティングシステムを作成することは確かに可能です。 EulerOSはその良い例です。 ただし、最新のプログラム、特にクローズドソースソフトウェアは、部分的にまたはまったく準拠していない

例として、bashシェルは以前は完全にPOSIXに準拠していました。 ただし、 bash の最近のバージョンは、デフォルトではPOSIX標準に準拠していません。 つまり、ほとんどのLinuxディストリビューションは部分的にPOSIXに準拠していると言えます。

4.3. ダーウィン

ダーウィンは、macOSやiOSなどのAppleのオペレーティングシステムのコアセットです。 部分的にPOSIXに準拠しています。 ただし、macOSの最近のリリースは完全にPOSIXに準拠しています。

4.4. Windows NT

Microsoft Windows は、その全体の設計がUNIXライクなオペレーティングシステムとは完全に異なるため、標準にまったく準拠していません。 ただし、WSL互換性レイヤーまたはCygwinを使用して、POSIX準拠の環境をセットアップできます。

4.5. その他

いくつかの独自のオペレーティングシステムはPOSIX認定を受けています。

5. 結論

この記事では、POSIXの背景とその確立方法について触れました。 その後、POSIXが最新のIEEE Std1003.12017号で定義している基本的な標準を確認しました。

最後に、POSIX準拠に関するオペレーティングシステムの現状について簡単に説明しました。