kazmax - Linux で自宅サーバー

sem_overview - 約束事その他の説明 - Linux コマンド集 一覧表

  1. 名前
  2. 説明
  3. Linux 固有の詳細事項
  4. 準拠
  5. 注意
  6. 関連項目

名前

sem_overview - POSIX セマフォの概要

説明

POSIX セマフォを使用すると、プロセスやスレッド間でその動作を 同期させることができる。
セマフォは整数であり、その値は決して 0 未満になることは許されない。 セマフォに対してできる操作は 2 つである: セマフォ値を 1 増やす ( sem_post (3));セマフォ値を 1 減らす ( sem_wait (3))。セマフォの値がすでに 0 の場合、セマフォ値が 0 より大きくなるまで   sem_wait (3) 操作は停止 (block) する。
POSIX セマフォには、名前付きセマフォ (named semaphore) と 名前なしセマフォ (unnamed semaphore) の 2つの形がある。

名前付きセマフォ

名前付きセマフォは /somename という形式の名前で識別される。   sem_open (3) に同じ名前を渡すことにより、2 つのプロセス間で同じ名前のセマフォ に対し操作を行うことができる。
  sem_open (3) 関数は、新しい名前付きセマフォを作成するか、既に存在する名前付き セマフォをオープンする。 セマフォをオープンした後は、   sem_post (3) と   sem_wait (3) を使ってセマフォを操作できる。 プロセスがセマフォの使用を終えた際は、   sem_close (3) を使ってセマフォをクローズできる。 あるセマフォをどのプロセスも使用しなくなると、   sem_unlink (3) を使ってそのセマフォをシステムから削除することができる。

名前なしセマフォ (メモリベース・セマフォ)

名前なしセマフォは名前を持たない。その代わり、セマフォは、 複数スレッド間で共有されたメモリ領域、もしくは複数プロセス間で 共有されたメモリ領域に置かれる (前者を スレッド共有セマフォ (thread-shared semaphore) 、後者を プロセス共有セマフォ (process-shared semaphore) と呼ぶ)。スレッド共有セマフォは、同じプロセス内のスレッド間で共有された メモリ領域、例えば大域変数 (global variable) に配置される。 プロセス共有セマフォは、共有メモリ領域 (例えば、   semget (2) を使って作成できる System V 共有メモリ・セグメントや   shm_open (3) を使って作成できる POSIX 共有メモリ・オブジェクト) 内に配置しなければならない。
名前なしセマフォは、使用する前に   sem_init (3) を使って初期化しなければならない。 セマフォは   sem_post (3) と   sem_wait (3) を使って操作できる。 セマフォがもはや必要なくなったときや、 セマフォが置かれているメモリを解放する前には、   sem_destroy (3) を使ってセマフォを破棄すべきである。

Linux 固有の詳細事項

バージョン

バージョン 2.6 より前のカーネルでは、Linux は 名前なしのスレッド共有セマフォのみをサポートしていた。 Linux 2.6 と NPTL スレッド実装を提供している glibc が入った システムでは、POSIX セマフォの完全な実装が提供される。

持続性

POSIX 名前付きセマフォはカーネル内で保持される。 sem_unlink ()で削除されなければ、セマフォは システムがシャットダウンされるまで存在し続ける。

リンク

POSIX セマフォ API を使用したプログラムは cc -lrt でコンパイルし、リアルタイムライブラリ librt とリンクしなければならない。

ファイルシステム経由での名前付きセマフォへのアクセス

Linux では、名前付きセマフォは仮想ファイルシステム (virtual file system) 内に sem. nameという形の名前で作成される。仮想ファイルシステムは通常 /dev/shm 以下にマウントされる。

準拠

POSIX.1-2001.

注意

System V セマフォ ( semget (2),  semop (2) など) は古いセマフォ API である。 POSIX セマフォは System V よりも 簡単で、うまく設計されたインタフェースを提供している。 一方で、POSIX セマフォは System V セマフォと比べると 利用できるシステムが少ない (特に、古いシステムでは少ない)。

各種の POSIX セマフォ関数を使用した例が   sem_wait (3) に記載されている。

関連項目