名 前
semop, semtimedop − System V セ マ フ ォ の 操 作
書 式
#include
<sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, size_t nsops);
int
semtimedop(int semid, struct sembuf
*sops, size_t nsops,
const struct timespec *timeout);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
semtimedop(): _GNU_SOURCE
説 明
System V セ マ フ ォ 集 合 (semaphore set) の メ ン バ ー の 各 セ マ フ ォ は 以 下 の 関 連 情 報 を 持 っ て い る :
unsigned short
semval; /* セ マ フ ォ 値 */
unsigned short semzcnt; /* ゼ ロ を
待 つ プ ロ セ ス
数 */
unsigned short semncnt; /* 増 加 を
待 つ プ ロ セ ス
数 */
pid_t sempid; /* 最 後 に 操
作 を 行 な っ た
プ ロ セ ス の ID */
semop() は semid で 指 定 さ れ た セ マ フ ォ 集 合 の 選 択 さ れ た セ マ フ ォ に 対 し て 操 作 を 行 う 。 sops は nsops 個 の 要 素 の 配 列 を 指 し 、 配 列 の 各 要 素 は 個 々 の セ マ フ ォ に 対 す る 操 作 を 示 す 構 造 体 で あ る 。 そ の 型 は struct sembuf で 、 次 の メ ン バ を 持 つ :
unsigned short
sem_num; /* セ マ フ ォ 番
号 */
short sem_op; /* セ マ フ ォ
操 作 */
short sem_flg; /* 操 作 フ ラ
グ */
sem_flg に は IPC_NOWAIT と SEM_UNDO が 設 定 で き る 。 SEM_UNDO が 指 定 さ れ た 操 作 は 、 そ の プ ロ セ ス が 終 了 し た 時 に 自 動 的 に 取 り 消 さ れ る 。
sops に 含 ま れ る 操 作 の 集 合 は 、 配 列 の 順 序 で 、 ア ト ミ ッ ク に 実 行 さ れ る 。 す な わ ち 、 全 て の 操 作 が 完 全 に 実 行 さ れ る か 、 全 く 実 行 さ れ な い か の ど ち ら か と な る 。 全 て の 操 作 が 直 ち に 実 行 で き な い 場 合 の こ の シ ス テ ム コ ー ル の 振 る 舞 い は 個 々 の 操 作 の sem_flg フ ィ ー ル ド に IPC_NOWAIT が 存 在 す る か に よ っ て 決 ま り 、 後 述 の よ う に な る 。 そ れ ぞ れ の 操 作 は セ マ フ ォ 集 合 の sem_num番 目 の セ マ フ ォ に 対 し て 実 行 さ れ る 。 セ マ フ ォ 集 合 の 最 初 の セ マ フ ォ に は 番 号 0 が 振 ら れ る 。 そ し て 操 作 は 三 種 類 あ り 、 sem_op の 値 で 区 別 さ れ る 。
sem_op が 正 の 整 数 の 場 合 、 そ の 値 を セ マ フ ォ の 値 (semval) に 加 算 す る 。 さ ら に 、 こ の 操 作 で SEM_UNDO が 指 定 さ れ て い た 場 合 は 、 シ ス テ ム は こ の セ マ フ ォ の の 調 整 値 (semadj) か ら 値 sem_op を 減 算 す る 。 こ の 操 作 は 必 ず 実 行 で き 、 ス レ ッ ド の 停 止 は 起 こ ら な い 。 呼 び 出 し 元 プ ロ セ ス は 対 象 の セ マ フ ォ 集 合 を 変 更 す る 許 可 が な け れ ば な ら な い 。
sem_op が 0 の 場 合 、 「 ゼ ロ ま で 待 つ 」 操 作 で あ る 。 こ の 場 合 、 プ ロ セ ス は そ の セ マ フ ォ 集 合 に 対 す る 読 み 込 み 許 可 が な け れ ば な ら な い 。 semval が 0 な ら ば 、 操 作 は 直 ち に 行 わ れ る 。 semval が 0 で な い 場 合 、 sem_flg に IPC_NOWAIT が 指 定 さ れ て い れ ば 、 semop() は 失 敗 し 、 errno に EAGAIN が 設 定 さ れ る (こ の と き sops に 対 す る 操 作 は 全 く 実 行 さ れ な い )。 sem_flg に IPC_NOWAIT が 指 定 さ れ て い な い 場 合 、 semzcnt (セ マ フ ォ 値 が 0 に な る の を 待 っ て い る ス レ ッ ド の 数 ) を 1 増 加 さ せ て 、 以 下 の い ず れ か が 起 こ る ま で ス レ ッ ド を 停 止 (sleep) す る 。
• |
semval が 0 に な っ た : こ の と き semzcnt の 値 は 1 減 算 さ れ る 。
セ マ フ ォ 集 合 が 削 除 さ れ た : こ の と き semop() は 失 敗 し 、 errno に EIDRM が 設 定 さ れ る 。 呼 び 出 し 元 ス レ ッ ド が シ グ ナ ル を 捕 獲 し た : こ の と き semzcnt の 値 は 1 減 算 さ れ 、 semop() は 失 敗 し errno に EINTR が 設 定 さ れ る 。 sem_op が 0 未 満 の 場 合 、 プ ロ セ ス に は そ の セ マ フ ォ 集 合 を 変 更 す る 許 可 が な け れ ば な ら な い 。 semval が sem_op の 絶 対 値 以 上 の 場 合 は 、 操 作 は 直 ち に 実 行 さ れ る : semval か ら sem_op の 絶 対 値 を 減 算 し 、 さ ら に 、 こ の 操 作 に SEM_UNDO が 指 定 さ れ て い る 場 合 は 、 こ の セ マ フ ォ の 調 整 値 (semadj) に sem_op の 絶 対 値 を 加 算 す る 。 semval が sem_op の 絶 対 値 よ り 小 さ く 、 sem_flg に IPC_NOWAIT が 指 定 さ れ た 場 合 は 、 semop() は 失 敗 し 、 errno に EAGAIN が 設 定 さ れ る (こ の と き sops の 操 作 は 全 く 実 行 さ れ な い )。 semval が sem_op の 絶 対 値 よ り 小 さ く 、 IPC_WAIT が 指 定 さ れ て い な い 場 合 は 、 semncnt (こ の セ マ フ ォ の 値 が 増 加 す る の を 待 っ て い る ス レ ッ ド 数 の カ ウ ン タ ー ) を 1 増 加 さ せ て 、 以 下 の い ず れ か が 起 こ る ま で ス レ ッ ド を 停 止 (sleep) す る 。
|