名 前
semctl − System V セ マ フ ォ の 制 御 操 作 を 行 な う
書 式
#include
<sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ...);
説 明
semctl() は 、 semid で 指 定 さ れ た System V セ マ フ ォ 集 合 (semaphore set) ま た は セ マ フ ォ 集 合 の semnun 番 目 の セ マ フ ォ に 対 し て 、 cmd で 指 定 さ れ た 制 御 操 作 を 行 な う (集 合 内 の セ マ フ ォ の 番 号 は 0 か ら 始 ま る )。 こ の 関 数 は 、 cmd の 値 に 依 存 し て 、 3 個 ま た は 4 個 の 引 き 数 を 持 つ 。 引 き 数 が 4 個 の 場 合 、 第 4 引 き 数 の 型 は union semun で あ る 。 呼 び 出 し 元 プ ロ グ ラ ム は 、 こ の 共 用 体 (union) を 以 下 の よ う に 定 義 し な け れ ば な ら な い 。
union semun {
int val; /* SETVAL の 値 */
struct semid_ds *buf; /* IPC_STAT, IPC_SET 用 の
バ ッ フ ァ ー */
unsigned short *array; /* GETALL, SETALL 用 の
配 列 */
struct seminfo *__buf; /* IPC_INFO 用 の
バ ッ フ ァ ー
(Linux 固 有 ) */ };
semid_ds デ ー タ 構 造 体 は <sys/sem.h> で 以 下 の よ う に 定 義 さ れ て い る :
struct semid_ds
{
struct ipc_perm sem_perm; /* 所 有 権
と 許 可 */
time_t sem_otime; /* 最 後 の semop
の 時 刻 */
time_t sem_ctime; /* 最 後 に 変
更 が 行 わ れ た
時 刻 */
unsigned long sem_nsems; /* 集 合 内
の セ マ フ ォ の
数 */ };
ipc_perm 構 造 体 は 以 下 の よ う に 定 義 さ れ て い る (強 調 さ れ た フ ィ ー ル ド は IPC_SET を 使 っ て 設 定 可 能 で あ る ):
struct ipc_perm
{
key_t __key; /* semget(2) に 与 え
ら れ る キ ー */
uid_t uid; /* 所 有 者 (owner)
の 実 効 UID */
gid_t gid; /* 所 有 者 の
実 効 GID */
uid_t cuid; /* 作 成 者 (creator) の
実 効 UID */
gid_t cgid; /* 作 成 者 の 実
効 GID */
unsigned short mode; /* 許 可 */
unsigned short __seq; /* シ ー ケ ン
ス 番 号 */ };
cmd と し て 有 効 な 値 は 次 の 通 り で あ る 。
IPC_STAT |
semid に 関 連 づ け ら れ た カ ー ネ ル デ ー タ 構 造 体 の 情 報 を arg.buf で 指 さ れ た semid_ds 構 造 体 へ コ ピ ー す る 。 semnum 引 き 数 は 無 視 さ れ る 。 呼 び 出 し た プ ロ セ ス は そ の セ マ フ ォ 集 合 に 対 す る 読 み 込 み 許 可 を 持 た な け れ ば な ら な い 。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IPC_SET |
arg.buf で 指 定 さ れ た semid_ds 構 造 体 の メ ン バ ー の い く つ か の 値 を 、 こ の セ マ フ ォ に 関 連 づ け ら れ た カ ー ネ ル デ ー タ 構 造 体 に 書 き 込 み 、 sem_ctime メ ン バ ー の 値 も 更 新 す る 。 構 造 体 の 以 下 の メ ン バ ー が 更 新 さ れ る : sem_perm.uid, sem_perm.gid, sem_perm.mode (の 最 下 位 9 ビ ッ ト )。 呼 び 出 し た プ ロ セ ス の 実 効 UID が 所 有 者 (sem_perm.uid) ま た は 作 成 者 (sem_perm.cuid) と 一 致 す る か 、 呼 び 出 し た 人 が 特 権 を 持 た な け れ ば な ら な い 。 semnum 引 き 数 は 無 視 さ れ る 。 セ マ フ ォ 集 合 を た だ ち に 削 除 し 、 そ の 集 合 上 の semop(2) コ ー ル で ブ ロ ッ ク さ れ て い る 全 て の プ ロ セ ス を 目 覚 め さ せ る (エ ラ ー 値 が 返 さ れ て 、 errno に EIDRM が 設 定 さ れ る )。 呼 び 出 し た プ ロ セ ス の 実 効 ユ ー ザ ー ID が そ の セ マ フ ォ 集 合 の 作 成 者 ま た は 所 有 者 と 一 致 す る か 、 呼 び 出 し た 人 が 特 権 を 持 た な け れ ば な ら な い 。 semnum 引 き 数 は 無 視 さ れ る 。 IPC_INFO (Linux 固 有 ) シ ス テ ム 全 体 で の セ マ フ ォ の 制 限 と パ ラ メ ー タ ー に 関 す る 情 報 を 、 arg.__buf が 指 す 構 造 体 に 入 れ て 返 す 。 こ の 構 造 体 は seminfo 型 で あ る 。 seminfo は _GNU_SOURCE 機 能 検 査 マ ク ロ が 定 義 さ れ た 場 合 に <sys/sem.h> で 以 下 の よ う に 定 義 さ れ る : struct seminfo
{ SEM_INFO (Linux 固 有 ) IPC_INFO の と き と 同 じ 情 報 を 格 納 し た seminfo 構 造 体 を 返 す 。 但 し 、 以 下 の フ ィ ー ル ド に は セ マ フ ォ が 消 費 し て い る シ ス テ ム 資 源 に 関 す る 情 報 が 格 納 さ れ る 点 が 異 な る 。 semusz フ ィ ー ル ド は 現 在 シ ス テ ム 上 に 存 在 す る セ マ フ ォ 集 合 の 数 を 返 す 。 semaem フ ィ ー ル ド は シ ス テ ム 上 の 全 て の セ マ フ ォ 集 合 に 含 ま れ る セ マ フ ォ の 総 数 を 返 す 。 SEM_STAT (Linux 固 有 ) IPC_STAT と 同 じ く semid_ds 構 造 体 を 返 す 。 但 し 、 semid 引 き 数 は 、 セ マ フ ォ 識 別 子 で は な く 、 シ ス テ ム 上 の 全 て の セ マ フ ォ 集 合 に 関 す る 情 報 を 管 理 す る カ ー ネ ル の 内 部 配 列 へ の イ ン デ ッ ク ス で あ る 。
返 す 。 semnum 引 き 数 は 無 視 さ れ る 。 呼 び 出 し た プ ロ セ ス は そ の セ マ フ ォ 集 合 に 読 み 込 み 許 可 を 持 た な け れ ば な ら な い 。
semnum 番 目 の セ マ フ ォ の semval の 増 加 を 待 っ て い る プ ロ セ ス の 数 を 返 す )。 呼 び 出 し た プ ロ セ ス は そ の セ マ フ ォ 集 合 に 読 み 込 み 許 可 を 持 た な け れ ば な ら な い 。
目 の セ マ フ ォ に 最 後 に semop(2) コ ー ル を 実 行 し た プ ロ セ ス の PID) を 返 す 。 呼 び 出 し た プ ロ セ ス は そ の セ マ フ ォ 集 合 に 読 み 込 み 許 可 を 持 た な け れ ば な ら な い 。
プ ロ セ ス は そ の セ マ フ ォ 集 合 に 読 み 込 み 許 可 を 持 た な け れ ば な ら な い 。
semnum 番 目 の セ マ フ ォ の semval の 値 が 0 に な る の を 待 っ て い る プ ロ セ ス の 数 を 返 す )。 呼 び 出 し た プ ロ セ ス は そ の セ マ フ ォ 集 合 に 読 み 込 み 許 可 を 持 た な け れ ば な ら な い 。
定 す る 。 そ の 集 合 に 関 連 す る semid_ds 構 造 体 の sem_ctime メ ン バ ー の 値 も 更 新 す る 。 全 て の プ ロ セ ス の セ マ フ ォ の 変 更 に つ い て の ア ン ド ゥ エ ン ト リ ー (semop(2) を 参 照 ) は 消 去 (clear) さ れ る 。 セ マ フ ォ の 値 の 変 更 に よ り 、 他 の プ ロ セ ス 内 で ブ ロ ッ ク さ れ て い る semop(2) コ ー ル の 続 行 が 許 可 さ れ る と 、 そ れ ら の プ ロ セ ス は 起 こ さ れ る (wake up)。 semnum 引 き 数 は 無 視 さ れ る 。 呼 び 出 し た プ ロ セ ス は そ の セ マ フ ォ 集 合 に 変 更 (書 き 込 み ) 許 可 を 持 た な け れ ば な ら な い 。
る 。 そ の 集 合 に 関 連 す る semid_ds 構 造 体 の sem_ctime メ ン バ ー の 値 も 更 新 す る 。 全 て の プ ロ セ ス の セ マ フ ォ の 変 更 に つ い て の ア ン ド ゥ エ ン ト リ ー は 消 去 さ れ る 。 セ マ フ ォ の 値 の 変 更 に よ り 、 他 の プ ロ セ ス 内 で ブ ロ ッ ク さ れ て い る semop(2) コ ー ル の 続 行 が 許 可 さ れ る と 、 そ れ ら の プ ロ セ ス は 起 こ さ れ る (wake up)。 呼 び 出 し た プ ロ セ ス は そ の セ マ フ ォ 集 合 に 変 更 (書 き 込 み ) 許 可 を 持 た な け れ ば な ら な い 。 返 り 値失 敗 し た 場 合 、 semctl() は −1 を 返 し 、 errno に そ の エ ラ ー を 示 す 。 そ う で な け れ ば シ ス テ ム コ ー ル は cmd に よ っ て 以 下 の 負 で な い 値 を 返 す :
|