Manpages

名 前

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 を 設 定 で き 、 オ ブ ジ ェ ク ト へ の 許 可 を ユ ー ザ ー 単 位 、 グ ル ー プ 単 位 で 制 御 す る こ と が で き る 。

準 拠

POSIX.1−2001.

注 意

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)

こ の 文 書 に つ い て

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