Available in

(2) (3) (2)/de (2)/es (2)/fr (2)/ja (2)/ko (2)/pl

Contents

名 前

shmget − 共 有 メ モ リ ・ セ グ メ ン ト を 割 り 当 て る

書 式

#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);

説 明

shmget() は key 引 き 数 に 対 応 す る 共 有 メ モ リ ・ セ グ メ ン ト の 識 別 子 を 返 す 。 key の 値 が IPC_PRIVATE の 場 合 、 も し く は key に 対 応 す る 共 有 メ モ リ ・ セ グ メ ン ト が 存 在 せ ず 、 shmflgIPC_CREAT が 指 定 さ れ て い た 場 合 、 新 し い 共 有 メ モ リ ・ セ グ メ ン ト を 作 成 す る 。 作 成 さ れ る 共 有 メ モ リ ・ セ グ メ ン ト は 、 size 引 き 数 の 値 を PAGE_SIZE の 倍 数 へ と 切 り 上 げ た (round up) 大 き さ と な る 。

shmflgIPC_CREATIPC_EXCL の 両 方 が 指 定 さ れ た 場 合 、 key に 対 応 す る 共 有 メ モ リ ・ セ グ メ ン ト が 既 に 存 在 す る と 、 shmget() は 失 敗 し 、 errnoEEXIST が 設 定 さ れ る (こ れ は open(2)O_CREAT | O_EXCL を 指 定 し た 場 合 の 動 作 と 同 じ で あ る )。

shmflg は 以 下 の 内 容 か ら 構 成 さ れ る :

IPC_CREAT 新 し い セ グ メ ン ト を 作 成 す る 。 こ の フ ラ グ が 指 定 さ れ な か っ た 場 合 、

shmget() は key に 対 応 す る セ グ メ ン ト を 探 し 、 ユ ー ザ が そ の セ グ メ ン ト に ア ク セ ス す る 許 可 が あ る か ど う か を チ ェ ッ ク す る 。

IPC_EXCL

IPC_CREAT と 共 に 使 用 し 、 セ グ メ ン ト が 既 に 存 在 し た 場 合 に は 失 敗 す る こ と を 保 証 す る 。

mode_flags

(下 位 9 ビ ッ ト ) 所 有 者 、 グ ル ー プ 、 他 人 (world) へ の 許 可 を 指 定 す る 。 こ れ ら の ビ ッ ト は open(2)mode 引 き 数 と 同 じ 形 式 で 同 じ 意 味 を 持 つ 。 今 の と こ ろ 、 シ ス テ ム は 実 行 (execute) 許 可 を 参 照 し な い 。

SHM_HUGETLB (Linux 2.6 以 降 )

"ヒ ュ ー ジ ペ ー ジ (huge page)" を 使 う セ グ メ ン ト を 割 り 当 て る 。 詳 細 な 情 報 は 、 カ ー ネ ル ・ ソ ー ス の フ ァ イ ル Documentation/vm/hugetlbpage.txt を 参 照 。

SHM_NORESERVE (Linux 2.6.15 以 降 ) こ の フ ラ グ は 、 mmap(2)MAP_NORESERVE フ ラ グ と 同 じ 役 割 を 果 た す 。 こ の セ グ メ ン ト に 対 す る ス ワ ッ プ 空 間 の 予 約 を 行 わ な い 。 ス ワ ッ プ 空 間 を 予 約 し た 場 合 は 、 そ の セ グ メ ン ト の 変 更 が 必 ず 成 功 す る こ と が 保 証 さ れ る 。 ス ワ ッ プ 空 間 の 予 約 を 行 わ な か っ た 場 合 は 、 物 理 メ モ リ に 空 き が な い と 書 き 込 み 時 に SIGSEGV を 受 け 取 る 可 能 性 が あ る 。 proc(5) に あ る /proc/sys/vm/overcommit_memory フ ァ イ ル に 関 す る 議 論 も 参 照 の こ と 。 共 有 メ モ リ ・ セ グ メ ン ト が 新 た に 作 成 さ れ る 際 、 共 有 メ モ リ ・ セ グ メ ン ト の 内 容 は 0 で 初 期 化 さ れ 、 関 連 情 報 を 保 持 す る デ ー タ 構 造 体 shmid_ds は 以 下 の よ う に 初 期 化 さ れ る 。

shm_perm.cuidshm_perm.uid に 呼 び 出 し 元 プ ロ セ ス の 実 効 (effective) ユ ー ザ ー ID を 設 定 す る 。

shm_perm.cgidshm_perm.gid に 呼 び 出 し 元 プ ロ セ ス の 実 効 グ ル ー プ ID を 設 定 す る 。

shm_perm.mode の 下 位 9 ビ ッ ト に shmflg の 下 位 9 ビ ッ ト を 設 定 す る 。

shm_segszsize の 値 を 設 定 す る 。

shm_lpid, shm_nattch, shm_atime, shm_dtime に 0 を 設 定 す る 。

shm_ctime に 現 在 の 時 刻 を 設 定 す る 。 共 有 メ モ リ ・ セ グ メ ン ト が 既 に 存 在 す る 場 合 、 ア ク セ ス 許 可 の 検 査 と 、 破 壊 (destruction) マ ー ク が つ け ら れ て い な い か の チ ェ ッ ク が 行 わ れ る 。

返 り 値

成 功 し た 場 合 、 有 効 な セ グ メ ン ト 識 別 子 shmid が 返 さ れ る 。 エ ラ ー の 場 合 、 −1 が 返 さ れ る 。

エ ラ ー

失 敗 し た 場 合 は errno が 以 下 の ど れ か に 設 定 さ れ る :

EACCES ユ ー ザ ー は そ の 共 有 メ モ リ ・ セ グ メ ン ト へ の ア ク セ ス 許 可 を 持 た ず 、

CAP_IPC_OWNER ケ ー パ ビ リ テ ィ も 持 っ て い な い 。

EEXIST

IPC_CREAT | IPC_EXCL が 指 定 さ れ て い た が 、 そ の セ グ メ ン ト が 既 に 存 在 す る 。

EINVAL

新 し い セ グ メ ン ト を 作 成 し よ う と し た 際 に size < SHMMIN ま た は size > SHMMAX で あ っ た 。 も し く は 、 指 定 さ れ た キ ー に 対 応 す る セ グ メ ン ト が 既 に 存 在 し て 、 新 し い セ グ メ ン ト を 作 成 し よ う と は し な か っ た が 、 size が 存 在 す る セ グ メ ン ト の サ イ ズ よ り も 大 き か っ た 。
ENFILE

シ ス テ ム 全 体 で オ ー プ ン さ れ て い る フ ァ イ ル の 総 数 が 上 限 に 達 し た 。

ENOENT 指 定 さ れ た

key に 対 応 す る セ グ メ ン ト が 存 在 せ ず 、 IPC_CREAT も 指 定

さ れ て い な か っ た 。

ENOMEM セ グ メ ン ト の 管 理 情 報

(overhead) に 割 り 当 て る メ モ リ が な か っ た 。

ENOSPC シ ス テ ム 全 体 の 共 有 メ モ

リ ・ セ グ メ ン ト 数 の 制 限 (SHMMNI) に 達 し た 、 ま た は 要 求 さ れ た size の セ グ メ ン ト の 割 り 当 て が シ ス テ ム 全 体 の 共 有 メ モ リ サ イ ズ の 制 限 (SHMALL) を 超 過 し た 。
EPERM

SHM_HUGETLB フ ラ グ が 指 定 さ れ た が 、 呼 び 出 し 元 に は 権 限 が な か っ た (CAP_IPC_LOCK ケ ー パ ビ リ テ ィ を 持 っ て い な か っ た )。

準 拠

SVr4, POSIX.1-2001.

SHM_HUGETLB は Linux で の 拡 張 で あ り 、 移 植 性 は な い 。

注 意

IPC_PRIVATE は フ ラ グ で は な く key_t 型 で あ る 。 こ の 特 別 な 値 が key に 使 用 さ れ た 場 合 は 、 shmget() は shmflg の 下 位 9 ビ ッ ト を 除 い た 全 て を 無 視 し 、 (成 功 す れ ば ) 新 し い 共 有 メ モ リ ・ セ グ メ ン ト を 作 成 す る 。

shmget() コ ー ル に 影 響 す る 共 有 メ モ リ ・ セ グ メ ン ト 資 源 の 制 限 は 以 下 の 通 り で あ る :

SHMALL シ ス テ ム 全 体 の 共 有 メ モ リ ・ ペ ー ジ の 最 大 数

(Linux で は 、 こ の 上 限 値

/proc/sys/kernel/shmall 経 由 で 参 照 し た り 、 変 更 し た り で き る )。

SHMMAX 共 有 メ モ リ ・ セ グ メ ン ト の バ イ ト 単 位 の 大 き さ の 上 限 : 方 針 依 存

(Linux で は 、 こ の 上 限 値 は /proc/sys/kernel/shmmax 経 由 で 参 照 し た り 、 変 更 し た り で き る )。

SHMMIN 共 有 メ モ リ ・ セ グ メ ン ト の バ イ ト 単 位 の 大 き さ の 下 限 : 実 装 依 存

(現 在

は 1 バ イ ト だ が 、 実 質 的 な 最 小 サ イ ズ は PAGE_SIZE で あ る )。

SHMMNI シ ス テ ム 全 体 の 共 有 メ モ リ ー の 数 の 上 限 : 実 装 依 存

(現 在 は

4096。 Linux 2.3.99 よ り 前 で は 128。 Linux で は 、 こ の 上 限 値 は /proc/sys/kernel/shmmni 経 由 で 参 照 し た り 、 変 更 し た り で き る )。 プ ロ セ ス 当 り の 共 有 メ モ リ ・ セ グ メ ン ト の 個 数 の 最 大 値 (SHMSEG) に 関 す る 実 装 上 の 制 限 は な い 。

Linux で の 注 意 バ ー ジ ョ ン 2.3.30 ま で は 、 Linux は 削 除 が 予 定 さ れ て い る 共 有 メ モ リ ・ セ グ メ ン ト に 対 し て shmget() が 行 わ れ る と EIDRM を 返 し て い た 。

バ グ

IPC_PRIVATE と い う 名 前 を 選 ん だ の は お そ ら く 失 敗 で あ ろ う 。 IPC_NEW の 方 が よ り 明 確 に そ の 機 能 を 表 し て い る だ ろ う 。

関 連 項 目

shmat(2), shmctl(2), shmdt(2), ftok(3), capabilities(7), shm_overview(7), svipc(7)

COMMENTS

blog comments powered by Disqus