名 前
semget − System V セ マ フ ォ 集 合 の 識 別 子 を 取 得 す る
書 式
#include
<sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
説 明
semget() シ ス テ ム コ ー ル は 、 引 き 数 key に 対 応 す る System V セ マ フ ォ 集 合 (semaphore set) の 識 別 子 (identifier) を 返 す 。 key の 値 が IPC_PRIVATE の 場 合 、 も し く は semflg に IPC_CREAT が 指 定 さ れ て い て 、 key に 対 応 す る セ マ フ ォ 集 合 が 存 在 し な い 場 合 、 nsems 個 の セ マ フ ォ か ら な る 新 し い 集 合 が 作 成 さ れ る 。
semflg に IPC_CREAT と IPC_EXCL の 両 方 が 指 定 さ れ た 場 合 、 key に 対 応 す る セ マ フ ォ 集 合 が 既 に 存 在 す る と 、 semget() は 失 敗 し 、 errno に EEXIST が 設 定 さ れ る (こ れ は open(2) に O_CREAT | O_EXCL が 指 定 さ れ た 場 合 の 動 作 と 同 じ で あ る )。 セ マ フ ォ 集 合 作 成 時 に 、 引 き 数 semflg の 下 位 9 ビ ッ ト は 、 そ の セ マ フ ォ 集 合 の (所 有 者 (owner)、 グ ル ー プ (group)、 他 人 (others) に 対 す る ) ア ク セ ス 許 可 の 定 義 と し て 使 用 さ れ る 。 こ れ ら の ビ ッ ト は open(2) の 引 き 数 mode と 同 じ 形 式 で 同 じ 意 味 で あ る (但 し 、 実 行 (execute) 許 可 は セ マ フ ォ で は 意 味 を 持 た ず 、 書 き 込 み (write) 許 可 は セ マ フ ォ 値 の 変 更 (alter) 許 可 と し て 機 能 す る )。 新 規 の セ マ フ ォ 集 合 を 作 成 す る 際 、 semget() は セ マ フ ォ 集 合 の 情 報 を 保 持 す る デ ー タ 構 造 体 semid_ds を 次 の よ う に 初 期 化 す る (semid_ds に つ い て は semctl(2) を 参 照 ):
sem_perm.cuid と sem_perm.uid に 、 呼 び 出 し 元 の プ ロ セ ス の 実 効 (effective) ユ ー ザ ー ID を 設 定 す る 。
sem_perm.cgid と sem_perm.gid に 、 呼 び 出 し 元 の プ ロ セ ス の 実 効 (effective) グ ル ー プ ID を 設 定 す る 。
sem_perm.mode の 下 位 9 ビ ッ ト に semflg の 下 位 9 ビ ッ ト を 設 定 す る 。
sem_nsems に nsems の 値 を 設 定 す る 。
sem_otime に 0 を 設 定 す る 。
sem_ctime に 現 在 の 時 刻 を 設 定 す る 。 セ マ フ ォ 集 合 の 作 成 を 行 わ な い 場 合 は 、 引 き 数 nsems に (don’t care を 意 味 す る ) 0 を 指 定 し て も よ い 。 そ う で な い 場 合 は 、 nsems は 0 よ り 大 き い 値 で な け れ ば な ら ず 、 セ マ フ ォ 集 合 あ た り の セ マ フ ォ の 最 大 数 (SEMMSL) 以 下 で な け れ ば な ら な い 。 セ マ フ ォ 集 合 が 既 に 存 在 し た 場 合 は 、 ア ク セ ス 許 可 の 検 査 が 行 わ れ る 。
返 り 値
成 功 し た 場 合 、 セ マ フ ォ 集 合 の 識 別 子 (非 負 の 整 数 ) が 返 り 値 と な る 。 失 敗 し た 場 合 は −1 が 返 さ れ 、 errno に エ ラ ー を 示 す 値 が 設 定 さ れ る 。
エ ラ ー
失 敗 し た 場 合 は errno に は 以 下 の 値 の ど れ か が 設 定 さ れ る :
EACCES |
key に 対 応 す る セ マ フ ォ 集 合 は 存 在 す る が 、 呼 び 出 し 元 の プ ロ セ ス は そ の 集 合 へ の ア ク セ ス 許 可 が な く 、 CAP_IPC_OWNER ケ ー パ ビ リ テ ィ も 持 っ て い な い 。 | ||
EEXIST |
semflg に IPC_CREAT と IPC_EXCL が 指 定 さ れ た が 、 key に 対 応 す る セ マ フ ォ 集 合 は す で に 存 在 す る 。 | ||
EINVAL |
nsems が 0 よ り 小 さ い か 、 セ マ フ ォ 集 合 あ た り の セ マ フ ォ の 最 大 数 (SEMMSL) よ り 大 き い 。 | ||
EINVAL |
key に 対 応 す る セ マ フ ォ 集 合 が 既 に 存 在 す る が 、 nsems が そ の 集 合 の セ マ フ ォ 数 よ り も 大 き い 。 | ||
ENOENT |
key に 対 応 す る セ マ フ ォ 集 合 が 存 在 せ ず 、 semflg に IPC_CREAT が 指 定 さ れ て も い な い 。 | ||
ENOMEM |
セ マ フ ォ 集 合 を 作 成 し よ う と し た が 、 新 し い デ ー タ 構 造 体 を 作 成 す る の に 十 分 な メ モ リ ー が シ ス テ ム に 存 在 し な い 。
ENOSPC セ マ フ ォ 集 合 を 作 成 し よ う と す る と 、 シ ス テ ム の セ マ フ ォ 集 合 の 最 大 数 |
(SEMMNI) か 、 シ ス テ ム 全 体 の セ マ フ ォ の 最 大 数 (SEMMNS) の い ず れ か を 超 え て し ま う 。
準 拠
SVr4, POSIX.1−2001.
注 意
Linux や POSIX の 全 て の バ ー ジ ョ ン で は 、 <sys/types.h> と <sys/ipc.h> の イ ン ク ル ー ド は 必 要 な い 。 し か し な が ら 、 い く つ か の 古 い 実 装 で は こ れ ら の ヘ ッ ダ ー フ ァ イ ル の イ ン ク ル ー ド が 必 要 で あ り 、 SVID で も こ れ ら の イ ン ク ル ー ド を す る よ う に 記 載 さ れ て い る 。 こ の よ う な 古 い シ ス テ ム へ の 移 植 性 を 意 図 し た ア プ リ ケ ー シ ョ ン で は こ れ ら の フ ァ イ ル を イ ン ク ル ー ド す る 必 要 が あ る か も し れ な い 。
IPC_PRIVATE は フ ラ グ フ ィ ー ル ド に 指 定 す る も の で は な く 、 key_t 型 で あ る 。 こ の 特 別 な 値 が key に 指 定 さ れ る と 、 semget() semflg の 下 位 9 ビ ッ ト 以 外 は 全 て 無 視 し 、 (成 功 し た 場 合 は ) 新 し い セ マ フ ォ 集 合 を 作 成 す る 。 セ マ フ ォ の 初 期 化 新 し く 作 成 さ れ た セ マ フ ォ 集 合 の 各 セ マ フ ォ の 値 は 不 定 で あ る 。 (こ の 点 は POSIX.1−2001 と POSIX.1−2008 に 明 記 さ れ て い る 。 た だ し 、 POSIX.1−2008 で は POSIX の 将 来 の バ ー ジ ョ ン で は セ マ フ ォ を 0 に 初 期 化 す る よ う に 実 装 に 要 求 す る 可 能 性 が 注 記 さ れ て い る 。 ) Linux は 他 の 多 く の 実 装 と 同 様 に セ マ フ ォ 値 を 0 に 初 期 化 す る が 、 移 植 性 を 考 慮 し た ア プ リ ケ ー シ ョ ン で は こ の 動 作 を 前 提 に す べ き で は な い 。 ア プ リ ケ ー シ ョ ン は 明 示 的 に セ マ フ ォ を 希 望 の 値 で 初 期 化 す べ き で あ る 。
semctl(2) の SETVAL か SETALL 操 作 を 使 っ て 初 期 化 す る こ と が で き る 。 複 数 箇 所 か ら セ マ フ ォ 集 合 の 操 作 が 行 わ れ る 場 面 で は 、 誰 が 最 初 に 集 合 を 初 期 化 す れ ば よ い か 分 か ら な い 。 こ の 状 況 を 避 け る に は 、 semctl(2) の IPC_STAT 操 作 で 取 得 で き る セ マ フ ォ の デ ー タ 構 造 体 の sem_otime が 0 以 外 に な っ て い る か を チ ェ ッ ク す れ ば よ い 。 セ マ フ ォ の 上 限 セ マ フ ォ 集 合 の リ ソ ー ス に 関 す る 上 限 の う ち 、 semget() に 影 響 を 及 ぼ す も の を 以 下 に 挙 げ る :
SEMMNI シ ス テ ム 全 体 の セ マ フ ォ 集 合 の 上 限 数 : 方 針 依 存 |
(Linux で は 、 こ の 制 |
限 値 は /proc/sys/kernel/sem の 第 4フ ィ ー ル ド に 対 応 し 、 読 み 出 し も 変 更 も で き る )。
SEMMSL セ マ フ ォ |
ID あ た り の セ マ フ ォ の 最 大 数 : 実 装 依 存 (Linux で は 、 こ の |
制 限 値 は /proc/sys/kernel/sem の 第 1フ ィ ー ル ド に 対 応 し 、 読 み 出 し も 変 更 も で き る )。
SEMMNS シ ス テ ム 全 体 の セ マ フ ォ 数 の 上 限 値 : 方 針 依 存 |
(Linux で は 、 こ の 上 限 |
値 は /proc/sys/kernel/sem の 第 2 フ ィ ー ル ド で あ り 、 読 み 出 し も 変 更 も で き る )。 シ ス テ ム 全 体 の セ マ フ ォ 数 に は 、 SEMMSL と SEMMNI の 積 と い う 上 限 も あ る 。
バ グ
IPC_PRIVATE と い う 名 前 を 選 ん だ の は お そ ら く 失 敗 で あ ろ う 。 IPC_NEW の 方 が よ り 明 確 に そ の 機 能 を 表 し て い る だ ろ う 。
関 連 項 目
semctl(2), semop(2), ftok(3), capabilities(7), sem_overview(7), svipc(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。