SEM_OVERVIEW

Section: Linux Programmer's Manual (7)
Updated: 2020-06-09
Index JM Home Page
 

名前

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 という形式の名前で識別される。 その名前は、最大で NAME_MAX-4 (すなわち 251) 文字のヌル終端された文字列で、 スラッシュで始まり、スラッシュ以外の文字が 1 文字以上続く形式である。 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) に配置される。 プロセス共有セマフォは、共有メモリー領域 (例えば、 shmget(2) を使って作成できる System V 共有メモリーセグメントや shm_open(3) を使って作成できる POSIX 共有メモリーオブジェクト) 内に配置しなければならない。
名前なしセマフォは、使用する前に sem_init(3) を使って初期化しなければならない。 セマフォは sem_post(3) と sem_wait(3) を使って操作できる。 セマフォがもはや必要なくなったときや、 セマフォが置かれているメモリーを解放する前には、 sem_destroy(3) を使ってセマフォを破棄すべきである。

この節の残りでは、POSIX セマフォの Linux の実装の詳細 について説明する。  

Versions

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

持続性

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

リンク

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

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

Linux では、名前付きセマフォは仮想ファイルシステム (virtual file system) 内に sem.somename という形の名前で作成される。仮想ファイルシステムは通常 /dev/shm 以下にマウントされる。 (これが、セマフォの名前の文字数の上限が NAME_MAX ではなく NAME_MAX-4 となっている理由である。)

Linux 2.6.19 以降では、このディレクトリ配下のファイルに対して ACL を 設定でき、オブジェクトへの許可をユーザー単位、グループ単位で制御することが できる。  

注意

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

例

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

関連項目

sem_close(3), sem_destroy(3), sem_getvalue(3), sem_init(3), sem_open(3), sem_post(3), sem_unlink(3), sem_wait(3), pthreads(7), shm_overview(7)  

この文書について

この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。

関連キーワード

セマフォ   共有   スレッド   メモリー   wait   操作   post   semaphore   領域   System   unlink   実装   提供   overview   スラッシュ   オープン   複数   配置   init   destroy   カーネル   仮想   ファイルシステム   単位   概要

Linux マニュアル 一覧

関連するコマンド・関数

sem_init.3   sem_unlink.3   sem_post.3   sem_close.3   shm_overview.7   sem_destroy.3
 

Index

名前
説明
Versions
持続性
リンク
ファイルシステム経由での名前付きセマフォへのアクセス
注意
例
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 04:38:52 GMT, October 11, 2026