名 前
shmget − System V 共 有 メ モ リ ー セ グ メ ン ト を 割 り 当 て る
書 式
#include
<sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
説 明
shmget() は key 引 き 数 に 対 応 す る System V 共 有 メ モ リ ー セ グ メ ン ト の 識 別 子 を 返 す 。 key の 値 が IPC_PRIVATE の 場 合 、 も し く は key に 対 応 す る 共 有 メ モ リ ー セ グ メ ン ト が 存 在 せ ず 、 shmflg に IPC_CREAT が 指 定 さ れ て い た 場 合 、 新 し い 共 有 メ モ リ ー セ グ メ ン ト を 作 成 す る 。 作 成 さ れ る 共 有 メ モ リ ー セ グ メ ン ト は 、 size 引 き 数 の 値 を PAGE_SIZE の 倍 数 へ と 切 り 上 げ た (round up) 大 き さ と な る 。
shmflg に IPC_CREAT と IPC_EXCL の 両 方 が 指 定 さ れ た 場 合 、 key に 対 応 す る 共 有 メ モ リ ー セ グ メ ン ト が 既 に 存 在 す る と 、 shmget() は 失 敗 し 、 errno に EEXIST が 設 定 さ れ る (こ れ は open(2) に O_CREAT | O_EXCL を 指 定 し た 場 合 の 動 作 と 同 じ で あ る )。
shmflg は 以 下 の 内 容 か ら 構 成 さ れ る :
IPC_CREAT 新 し い セ グ メ ン ト を 作 成 す る 。 こ の フ ラ グ が 指 定 さ れ な か っ た 場 合 、 |
shmget() は key に 対 応 す る セ グ メ ン ト を 探 し 、 ユ ー ザ ー が そ の セ グ メ ン ト に ア ク セ ス す る 許 可 が あ る か ど う か を チ ェ ッ ク す る 。
IPC_EXCL こ の フ ラ グ は |
IPC_CREAT と と も に 使 用 し 、 こ の 呼 び 出 し で 確 実 |
に セ グ メ ン ト が 作 成 さ れ る よ う に す る 。 セ グ メ ン ト が 既 に 存 在 し た 場 合 に は 、 呼 び 出 し は 失 敗 す る 。
SHM_HUGETLB (Linux 2.6 以 降 )
"ヒ ュ ー ジ ペ ー ジ (huge page)" を 使 う セ グ メ ン ト を 割 り 当 て る 。 詳 細 な 情 報 は 、 Linux カ ー ネ ル ソ ー ス の フ ァ イ ル Documentation/vm/hugetlbpage.txt を 参 照 。
SHM_NORESERVE (Linux 2.6.15 以 降 ) こ の フ ラ グ は 、 mmap(2) の MAP_NORESERVE フ ラ グ と 同 じ 役 割 を 果 た す 。 こ の セ グ メ ン ト に 対 す る ス ワ ッ プ 空 間 の 予 約 を 行 わ な い 。 ス ワ ッ プ 空 間 を 予 約 し た 場 合 は 、 そ の セ グ メ ン ト の 変 更 が 必 ず 成 功 す る こ と が 保 証 さ れ る 。 ス ワ ッ プ 空 間 の 予 約 を 行 わ な か っ た 場 合 は 、 物 理 メ モ リ ー に 空 き が な い と 書 き 込 み 時 に SIGSEGV を 受 け 取 る 可 能 性 が あ る 。 proc(5) に あ る /proc/sys/vm/overcommit_memory フ ァ イ ル に 関 す る 議 論 も 参 照 の こ と 。 上 記 の フ ラ グ に 加 え て 、 shmflg の 下 位 9 ビ ッ ト は 、 所 有 者 、 グ ル ー プ 、 そ の 他 へ の 許 可 を 指 定 す る 。 こ れ ら の ビ ッ ト は open(2) の mode 引 き 数 と 同 じ 形 式 で 同 じ 意 味 を 持 つ 。 今 の と こ ろ 、 シ ス テ ム は 実 行 (execute) 許 可 を 参 照 し な い 。 共 有 メ モ リ ー セ グ メ ン ト が 新 た に 作 成 さ れ る 際 、 共 有 メ モ リ ー セ グ メ ン ト の 内 容 は 0 で 初 期 化 さ れ 、 関 連 情 報 を 保 持 す る デ ー タ 構 造 体 shmid_ds は 以 下 の よ う に 初 期 化 さ れ る 。
shm_perm.cuid と shm_perm.uid に 呼 び 出 し 元 プ ロ セ ス の 実 効 (effective) ユ ー ザ ー ID を 設 定 す る 。
shm_perm.cgid と shm_perm.gid に 呼 び 出 し 元 プ ロ セ ス の 実 効 グ ル ー プ ID を 設 定 す る 。
shm_perm.mode の 下 位 9 ビ ッ ト に shmflg の 下 位 9 ビ ッ ト を 設 定 す る 。
shm_segsz に size の 値 を 設 定 す る 。
shm_lpid, shm_nattch, shm_atime, shm_dtime に 0 を 設 定 す る 。
shm_ctime に 現 在 の 時 刻 を 設 定 す る 。 共 有 メ モ リ ー セ グ メ ン ト が 既 に 存 在 す る 場 合 、 ア ク セ ス 許 可 の 検 査 と 、 破 壊 (destruction) マ ー ク が つ け ら れ て い な い か の チ ェ ッ ク が 行 わ れ る 。
返 り 値
成 功 の 場 合 、 有 効 な 共 有 メ モ リ ー セ グ メ ン ト の 識 別 子 が 返 さ れ る 。 エ ラ ー の 場 合 、 −1 が 返 り 、 errno に エ ラ ー を 示 す 値 が 設 定 さ れ る 。
エ ラ ー
失 敗 し た 場 合 は errno が 以 下 の ど れ か に 設 定 さ れ る :
EACCES ユ ー ザ ー は そ の 共 有 メ モ リ ー セ グ メ ン ト へ の ア ク セ ス 許 可 を 持 た ず 、 |
CAP_IPC_OWNER ケ ー パ ビ リ テ ィ も 持 っ て い な い 。
EEXIST |
IPC_CREAT と IPC_EXCL が shmflg に 指 定 さ れ た が 、 key に 対 応 す る 共 有 メ モ リ ー セ グ メ ン ト は す で に 存 在 す る 。
新 し い セ グ メ ン ト を 作 成 し よ う と し た が 、 size が SHMMIN よ り 小 さ い か SHMMAX よ り も 大 き か っ た 。
指 定 さ
れ た key に 対 応
す る セ グ メ ン
ト が 既 に 存 在
す る が 、 size が
そ の セ グ メ ン
ト の サ イ ズ よ
り も 大 き か っ
た 。 シ ス テ ム 全 体 で オ ー プ ン さ れ て い る フ ァ イ ル の 総 数 が 上 限 に 達 し た 。
さ れ て い な か っ た 。
|