Manpages

名 前

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 に 対 応 す る 共 有 メ モ リ ー セ グ メ ン ト が 存 在 せ ず 、 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 と と も に 使 用 し 、 こ の 呼 び 出 し で 確 実

に セ グ メ ン ト が 作 成 さ れ る よ う に す る 。 セ グ メ ン ト が 既 に 存 在 し た 場 合 に は 、 呼 び 出 し は 失 敗 す る 。

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.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) マ ー ク が つ け ら れ て い な い か の チ ェ ッ ク が 行 わ れ る 。

返 り 値

成 功 の 場 合 、 有 効 な 共 有 メ モ リ ー セ グ メ ン ト の 識 別 子 が 返 さ れ る 。 エ ラ ー の 場 合 、 −1 が 返 り 、 errno に エ ラ ー を 示 す 値 が 設 定 さ れ る 。

エ ラ ー

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

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

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

EEXIST

IPC_CREATIPC_EXCLshmflg に 指 定 さ れ た が 、 key に 対 応 す る 共 有 メ モ リ ー セ グ メ ン ト は す で に 存 在 す る 。

EINVAL

新 し い セ グ メ ン ト を 作 成 し よ う と し た が 、 sizeSHMMIN よ り 小 さ い か SHMMAX よ り も 大 き か っ た 。

EINVAL

指 定 さ れ た key に 対 応 す る セ グ メ ン ト が 既 に 存 在 す る が 、 size が そ の セ グ メ ン ト の サ イ ズ よ り も 大 き か っ た 。
ENFILE

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

ENOENT 指 定 さ れ た

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

さ れ て い な か っ た 。

ENOMEM セ グ メ ン ト の 管 理 情 報

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

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

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

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

準 拠

SVr4, POSIX.1−2001.

SHM_HUGETLBSHM_NORESERVE は Linux で の 拡 張 で あ る 。

注 意

Linux や POSIX の 全 て の バ ー ジ ョ ン で は 、 <sys/types.h><sys/ipc.h> の イ ン ク ル ー ド は 必 要 な い 。 し か し な が ら 、 い く つ か の 古 い 実 装 で は こ れ ら の ヘ ッ ダ ー フ ァ イ ル の イ ン ク ル ー ド が 必 要 で あ り 、 SVID で も こ れ ら の イ ン ク ル ー ド を す る よ う に 記 載 さ れ て い る 。 こ の よ う な 古 い シ ス テ ム へ の 移 植 性 を 意 図 し た ア プ リ ケ ー シ ョ ン で は こ れ ら の フ ァ イ ル を イ ン ク ル ー ド す る 必 要 が あ る か も し れ な い 。

IPC_PRIVATE は フ ラ グ で は な く key_t 型 で あ る 。 こ の 特 別 な 値 が key に 使 用 さ れ た 場 合 は 、 shmget() は shmflg の 下 位 9 ビ ッ ト を 除 い た 全 て を 無 視 し 、 新 し い 共 有 メ モ リ ー セ グ メ ン ト を 作 成 す る 。 共 有 メ モ リ ー の 上 限
shmget
() コ ー ル に 影 響 す る 共 有 メ モ リ ー セ グ メ ン ト 資 源 の 制 限 は 以 下 の 通 り で あ る :

SHMALL 共 有 メ モ リ ー の 全 使 用 量 の シ ス テ ム 全 体 で の 上 限 値 。 シ ス テ ム ペ ー ジ サ イ ズ が 単 位 で あ る 。

Linux で は 、 こ の 上 限 値 は /proc/sys/kernel/shmall 経 由 で 参 照 し た り 、 変 更 し た り で き る 。 Linux 3.16 以 降 で は 、 こ の 上 限 値 の デ フ ォ ル ト 値 は 以 下 の と お り で あ る 。

ULONG_MAX − 2^24 こ の 値 は 割 り 当 て に 関 す る 上 限 と し て は 適 用 さ れ な い (な お 、 こ の 値 は 32 ビ ッ ト シ ス テ ム に も 64 ビ ッ ト シ ス テ ム に も 適 し た も の に な っ て い る )。 ULONG_MAX で は な く 、 こ の 値 が 選 ば れ た の は 、 古 い ア プ リ ケ ー シ ョ ン が 最 初 に 現 在 の 値 を 確 認 せ ず に 既 存 の 上 限 を そ の ま ま 増 や し て し ま っ て も 問 題 が 起 こ ら な い よ う な デ フ ォ ル ト 値 を 選 ん だ か ら で あ る 。 こ の よ う な ア プ リ ケ ー シ ョ ン で は 、 上 限 を ULONG_MAX に 設 定 す る と 値 が オ ー バ ー フ ロ ー し て し ま う こ と に な る 。

Linux 2.4 か ら Linux 3.15 で は 、 こ の 上 限 の デ フ ォ ル ト 値 は 以 下 で あ っ た 。

SHMMAX / PAGE_SIZE * (SHMMNI / 16)

SHMMAXSHMMNI が 変 更 さ れ な い と す る と 、 こ の 式 の 結 果 に (バ イ ト 単 位 の 値 を 得 る た め に ) ペ ー ジ サ イ ズ を 掛 け 算 す る と 、 全 て の 共 有 メ モ リ ー セ グ メ ン ト で 使 用 さ れ る 全 メ モ リ ー の 上 限 と し て 、 8 GB と い う 値 が 得 ら れ る 。

SHMMAX

1 つ の 共 有 メ モ リ ー セ グ メ ン ト の 最 大 サ イ ズ (バ イ ト 数 )。

Linux で は 、 こ の 上 限 値 は /proc/sys/kernel/shmmax 経 由 で 参 照 し た り 、 変 更 し た り で き る 。 Linux 3.16 以 降 で は 、 こ の 上 限 値 の デ フ ォ ル ト 値 は 以 下 の と お り で あ る 。

ULONG_MAX − 2^24 こ の 値 は 割 り 当 て に 関 す る 上 限 と し て は 適 用 さ れ な い (な お 、 こ の 値 は 32 ビ ッ ト シ ス テ ム に も 64 ビ ッ ト シ ス テ ム に も 適 し た も の に な っ て い る )。 (ULONG_MAX で は な く ) こ の デ フ ォ ル ト 値 が 使 わ れ て い る 理 由 に つ い て は SHMALL の 説 明 を 参 照 。

Linux 2.2 か ら Linux 3.15 ま で は 、 こ の 上 限 値 の デ フ ォ ル ト 値 は 0x2000000 (32MB) で あ っ た 。 共 有 メ モ リ ー セ グ メ ン ト の 一 部 分 だ け を マ ッ ピ ン グ す る こ と は で き な い の で 、 使 用 可 能 な セ グ メ ン ト の 最 大 サ イ ズ に は 仮 想 メ モ リ ー の 総 量 と い う 別 の 上 限 が 適 用 さ れ る 。 例 え ば 、 i386 で は マ ッ ピ ン グ 可 能 な 最 大 セ グ メ ン ト の 大 き さ は お お よ そ 2.8GB で 、 x86_64 で は 上 限 は お お よ そ 127TB で あ る 。

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

(現 在

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

SHMMNI シ ス テ ム 全 体 の 共 有 メ モ リ ー セ グ メ ン ト 数 の 上 限 値 。 こ の 上 限 値 の デ フ ォ ル ト は 、

Linux 2.2 以 降 で は 128、 Linux 2.4 以 降 で 4096 で あ る 。

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

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

バ グ

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

関 連 項 目

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

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。