Man page - shmget(2)

Packages contains this manual

Available languages:

en fr pl ja ru de

Manual

SHMGET

名 前
書 式
説 明
返 り 値
エ ラ ー
準 拠
注 意
共 有 メ モ リ ー の 上 限
Linux で の 注 意
バ グ

関 連 項 目
こ の 文 書 に つ い て

名 前

shmget - System V 共 有 メ モ リ ー セ グ メ ン ト を 割 り 当 て る

書 式

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

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

説 明

shmget () returns the identifier of the System V shared memory segment associated with the value of the argument key . It may be used either to obtain the identifier of a previously created shared memory segment (when shmflg is zero and key does not have the value IPC_PRIVATE ), or to create a new set.

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/admin-guide/vm/hugetlbpage.rst を 参 照 。

SHM_HUGE_2MB , SHM_HUGE_1GB (Linux 3.8 以 降 )

Used in conjunction with SHM_HUGETLB to select alternative hugetlb page sizes (respectively, 2 MB and 1 GB) on systems that support multiple hugetlb page sizes.

More generally, the desired huge page size can be configured by encoding the base-2 logarithm of the desired page size in the six bits at the offset SHM_HUGE_SHIFT . Thus, the above two constants are defined as:

#define SHM_HUGE_2MB (21 << SHM_HUGE_SHIFT)
#define SHM_HUGE_1GB (30 << SHM_HUGE_SHIFT)

For some additional details, see the discussion of the similarly named constants in mmap (2).

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

The user does not have permission to access the shared memory segment, and does not have the CAP_IPC_OWNER capability in the user namespace that governs its IPC namespace.

EEXIST

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

EINVAL

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

EINVAL

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

ENFILE

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

ENOENT

指 定 さ れ た key に 対 応 す る セ グ メ ン ト が 存 在 せ ず 、 IPC_CREAT も 指 定 さ れ て い な か っ た 。

ENOMEM

セ グ メ ン ト の 管 理 情 報 (overhead) に 割 り 当 て る メ モ リ ー が な か っ た 。

ENOSPC

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

EPERM

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

準 拠

POSIX.1-2001, POSIX.1-2008, SVr4.

SHM_HUGETLB SHM_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)

SHMMAX SHMMNI が 変 更 さ れ な い と す る と 、 こ の 式 の 結 果 に (バ イ ト 単 位 の 値 を 得 る た め に ) ペ ー ジ サ イ ズ を 掛 け 算 す る と 、 全 て の 共 有 メ モ リ ー セ グ メ ン ト で 使 用 さ れ る 全 メ モ リ ー の 上 限 と し て 、 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 (32 MB) で あ っ た 。

共 有 メ モ リ ー セ グ メ ン ト の 一 部 分 だ け を マ ッ ピ ン グ す る こ と は で き な い の で 、 使 用 可 能 な セ グ メ ン ト の 最 大 サ イ ズ に は 仮 想 メ モ リ ー の 総 量 と い う 別 の 上 限 が 適 用 さ れ る 。 例 え ば 、 i386 で は マ ッ ピ ン グ 可 能 な 最 大 セ グ メ ン ト の 大 き さ は お お よ そ 2.8 GB で 、 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 の 方 が よ り 明 確 に そ の 機 能 を 表 し て い る だ ろ う 。

shmop (2) を 参 照 。

関 連 項 目

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

こ の 文 書 に つ い て

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