Man page - shmctl(2)

Packages contains this manual

Available languages:

en fr pl ja

Manual

SHMCTL

名 前
書 式
説 明
返 り 値
エ ラ ー
準 拠
注 意
関 連 項 目
こ の 文 書 に つ い て

名 前

shmctl - System V 共 有 メ モ リ ー (shared memory) を 制 御 す る

書 式

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

int shmctl(int shmid , int cmd , struct shmid_ds * buf );

説 明

shmctl () は 、 識 別 子 が shmid の System V 共 有 メ モ リ ー セ グ メ ン ト に 対 し て cmd で 指 示 し た 制 御 命 令 を 実 行 す る 。

buf 引 数 は 、 shmid_ds 構 造 体 へ の ポ イ ン タ ー で あ る 。 こ の 構 造 体 は <sys/shm.h> で 以 下 の よ う に 定 義 さ れ て い る

struct shmid_ds {
struct ipc_perm shm_perm; /* 所 有 権 と 許 可 */
size_t shm_segsz; /* セ グ メ ン ト の サ イ ズ (バ イ ト ) */
time_t shm_atime; /* 最 後 の 付 加 (attach) の 時 刻 */
time_t shm_dtime; /* 最 後 の 分 離 (detach) の 時 刻 */
time_t shm_ctime; /* 作 成 時 刻 / shmctl() に よ る
最 後 の 変 更 時 刻 */
pid_t shm_cpid; /* 作 成 者 (creator) の PID */
pid_t shm_lpid; /* 最 後 の shmat(2)/shmdt(2) の PID */
shmatt_t shm_nattch; /* 現 在 付 加 さ れ て い る 数 */
...
};

shmid_ds 構 造 体 の フ ィ ー ル ド は 以 下 の 通 り で あ る 。

shm_perm

This is an ipc_perm structure (see below) that specifies the access permissions on the shared memory segment.

shm_segsz

共 有 メ モ リ ー セ グ メ ン ト の サ イ ズ (バ イ ト 単 位 )。

shm_atime

Time of the last shmat (2) system call that attached this segment.

shm_dtime

Time of the last shmdt (2) system call that detached tgis segment.

shm_ctime

Time of creation of segment or time of the last shmctl () IPC_SET operation.

shm_cpid

そ の 共 有 メ モ リ ー セ グ メ ン ト を 作 成 し た プ ロ セ ス の ID。

shm_lpid

ID of the last process that executed a shmat (2) or shmdt (2) system call on this segment.

shm_nattch

Number of processes that have this segment attached.

ipc_perm 構 造 体 は 以 下 の よ う に 定 義 さ れ て い る (強 調 さ れ た フ ィ ー ル ド は IPC_SET を 使 っ て 設 定 可 能 で あ る ):

struct ipc_perm {
key_t __key; /* shmget(2) に 与 え ら れ る キ ー */
uid_t uid ; /* 所 有 者 の 実 効 UID */
gid_t gid ; /* 所 有 者 の 実 効 GID */
uid_t cuid; /* 作 成 者 の 実 効 UID */
gid_t cgid; /* 作 成 者 の 実 効 GID */
unsigned short mode ; /* 許 可 + SHM_DEST と
SHM_LOCKED フ ラ グ */
unsigned short __seq; /* シ ー ケ ン ス 番 号 */
};

The least significant 9 bits of the mode field of the ipc_perm structure define the access permissions for the shared memory segment. The permission bits are as follows:

Image grohtml-6939-1.png

Bits 0100, 0010, and 0001 (the execute bits) are unused by the system. (It is not necessary to have execute permission on a segment in order to perform a shmat (2) call with the SHM_EXEC flag.)

cmd と し て 有 効 な 値 は 以 下 の 通 り :
IPC_STAT

shmid に 関 連 づ け ら れ た カ ー ネ ル デ ー タ 構 造 体 の 情 報 を buf で 指 さ れ た shmid_ds 構 造 体 に コ ピ ー す る 。 呼 び 出 し 元 は 共 有 メ モ リ ー セ グ メ ン ト に 対 す る 読 み 込 み 許 可 を 持 た な け れ ば な ら な い 。

IPC_SET

Write the values of some members of the shmid_ds structure pointed to by buf to the kernel data structure associated with this shared memory segment, updating also its shm_ctime member.

以 下 の フ ィ ー ル ド が 更 新 さ れ る : shm_perm.uid , shm_perm.gid お よ び shm_perm.mode (の 下 位 9 ビ ッ ト )。

The effective UID of the calling process must match the owner ( shm_perm.uid ) or creator ( shm_perm.cuid ) of the shared memory segment, or the caller must be privileged.

IPC_RMID

セ グ メ ン ト に 破 棄 済 み の マ ー ク を 付 け る 。 セ グ メ ン ト は 、 実 際 に は 最 後 プ ロ セ ス が セ グ メ ン ト を 分 離 し た (関 連 す る shmid_ds 構 造 体 の shm_nattch メ ン バ ー が 0 に な っ た ) 後 で の み 破 棄 さ れ る 。 呼 び 出 し 元 は そ の セ グ メ ン ト の 所 有 者 か 作 成 者 で あ る か 、 特 権 を 持 た な け れ ば な ら な い 。 buf 引 数 は 無 視 さ れ る 。

セ グ メ ン ト に 破 棄 の マ ー ク が 付 け ら れ る と 、 関 連 す る デ ー タ 構 造 体 に お い て shm_perm.mode フ ィ ー ル ド の (標 準 で は な い ) SHM_DEST フ ラ グ が 設 定 さ れ る 。 こ の デ ー タ 構 造 体 は IPC_STAT で 取 得 さ れ る 。

呼 び 出 し 元 は 最 終 的 に は セ グ メ ン ト を 忘 れ ず に 破 棄 し な け れ ば な ら な い 。 そ う で な れ ば 、 フ ォ ー ル ト (fault) さ れ た ペ ー ジ は メ モ リ ー か ス ワ ッ プ (swap) に 残 り 続 け る 。

proc (5) の /proc/sys/kernel/shm_rmid_forced の 説 明 も 参 照 の こ と 。

IPC_INFO (Linux 固 有 )

シ ス テ ム 全 体 で の 共 有 メ モ リ ー の 制 限 と パ ラ メ ー タ ー に 関 す る 情 報 を 、 buf が 指 す 構 造 体 に 入 れ て 返 す 。 こ の 構 造 体 は shminfo 型 で あ る (そ の た め キ ャ ス ト が 必 要 で あ る )。 shminfo _GNU_SOURCE 機 能 検 査 マ ク ロ が 定 義 さ れ た 場 合 に <sys/shm.h> で 以 下 の よ う に 定 義 さ れ る :

struct shminfo {
unsigned long shmmax; /* 最 大 セ グ メ ン ト サ イ ズ */
unsigned long shmmin; /* 最 小 セ グ メ ン ト サ イ ズ 。
常 に 1 */
unsigned long shmmni; /* 最 大 セ グ メ ン ト 数 */
unsigned long shmseg; /* プ ロ セ ス が 付 加 で き る
セ グ メ ン ト の 最 大 数 。
カ ー ネ ル 内 で は 未 使 用 */
unsigned long shmall; /* 共 有 メ モ リ ー の 最 大 ペ ー ジ 数 。
シ ス テ ム 全 体 で の 値 */
};

設 定 shmmni , shmmax , shmall /proc に あ る 同 じ 名 前 の フ ァ イ ル 経 由 で 変 更 可 能 で あ る 。 詳 し く は proc (5) を 参 照 。

SHM_INFO (Linux 固 有 )

共 有 メ モ リ ー が 消 費 し て い る シ ス テ ム 資 源 に 関 す る 情 報 を 格 納 し た shm_info 構 造 体 を 返 す 。 こ の 構 造 体 は 、 _GNU_SOURCE 機 能 検 査 マ ク ロ が 定 義 さ れ た 場 合 に <sys/shm.h> で 以 下 の よ う に 定 義 さ れ る :

struct shm_info {
int used_ids; /* 現 在 存 在 す る セ グ メ ン ト 数 */
unsigned long shm_tot; /* 共 有 メ モ リ ー の ペ ー ジ 総 数 */
unsigned long shm_rss; /* メ モ リ ー 上 に あ る (ス ワ ッ プ さ れ て
い な い ) 共 有 メ モ リ ー ペ ー ジ 数 */
unsigned long shm_swp; /* ス ワ ッ プ さ れ て い る 共 有 メ モ リ ー
ペ ー ジ 数 */
unsigned long swap_attempts;
/* Linux 2.4 以 降 で は 未 使 用 */
unsigned long swap_successes;
/* Linux 2.4 以 降 で は 未 使 用 */
};

SHM_STAT (Linux 固 有 )

IPC_STAT と 同 じ く shmid_ds 構 造 体 を 返 す 。 但 し 、 shmid 引 数 は 、 セ グ メ ン ト 識 別 子 で は な く 、 シ ス テ ム 上 の 全 て の 共 有 メ モ リ ー セ グ メ ン ト に 関 す る 情 報 を 管 理 す る カ ー ネ ル の 内 部 配 列 へ の イ ン デ ッ ク ス で あ る 。

SHM_STAT_ANY (Linux-specific, Linux 4.17 以 降 )

Return a shmid_ds structure as for SHM_STAT . However, shm_perm.mode is not checked for read access for shmid , meaning that any user can employ this operation (just as any user may read /proc/sysvipc/shm to obtain the same information).

呼 び 出 し 元 は 、 cmd に 以 下 の 値 を 指 定 す る こ と で 、 共 有 メ モ リ ー セ グ メ ン ト が ス ワ ッ プ さ れ る こ と を 防 止 し た り 、 許 可 し た り で き る :
SHM_LOCK
(Linux 固 有 )

共 有 メ モ リ ー セ グ メ ン ト を ス ワ ッ プ す る こ と を 防 止 す る 。 ロ ッ ク が 有 効 に な っ た 後 、 呼 び 出 し 元 は 、 存 在 す る こ と が 要 求 さ れ た 全 て の ペ ー ジ を フ ォ ー ル ト さ せ な け れ ば な ら な い 。 セ グ メ ン ト が ロ ッ ク さ れ る と 、 関 連 す る デ ー タ 構 造 体 に お い て shm_perm.mode フ ィ ー ル ド の (標 準 的 で は な い ) SHM_LOCKED フ ラ グ が 設 定 さ れ る 。 こ の デ ー タ 構 造 体 は IPC_STAT で 取 得 さ れ る 。

SHM_UNLOCK (Linux 固 有 )

セ グ メ ン ト の ロ ッ ク を 解 除 し 、 ス ワ ッ プ ア ウ ト す る こ と を 可 能 に す る 。

2.6.10 よ り 前 の カ ー ネ ル で は 、 特 権 プ ロ セ ス だ け が SHM_LOCK SHM_UNLOCK を 利 用 す る こ と が で き た 。 2.6.10 以 降 の カ ー ネ ル で は 、 非 特 権 プ ロ セ ス で あ っ て も 次 の 条 件 を 満 た せ ば こ れ ら の 操 作 を 利 用 す る こ と が で き る 。 そ の 条 件 と は 、 プ ロ セ ス の 実 効 UID が そ の セ グ メ ン ト の 所 有 者 も し く は 作 成 者 の UID と 一 致 し 、 ( SHM_LOCK の 場 合 に は ) ロ ッ ク す る メ モ リ ー の 合 計 が RLIMIT_MEMLOCK リ ソ ー ス 上 限 ( setrlimit (2) 参 照 ) の 範 囲 内 に 入 っ て い る こ と で あ る 。

返 り 値

IPC_INFO SHM_INFO 操 作 は 、 成 功 す る と 、 全 て の 共 有 メ モ リ ー セ グ メ ン ト に 関 す る 情 報 を 管 理 し て い る カ ー ネ ル の 内 部 配 列 の 使 用 中 エ ン ト リ ー の イ ン デ ッ ク ス の う ち 最 大 値 を 返 す (こ の 情 報 は 、 シ ス テ ム の 全 て の 共 有 メ モ リ ー セ グ メ ン ト に 関 す る 情 報 を 取 得 す る た め に 、 操 作 SHM_STAT SHM_STAT_ANY を 繰 り 返 し 実 行 す る 際 に 使 用 で き る )。 SHM_STAT 操 作 は 、 成 功 す る と 、 shmid で 指 定 さ れ た イ ン デ ッ ク ス を 持 つ 共 有 メ モ リ ー セ グ メ ン ト の 識 別 子 を 返 す 。 他 の 操 作 は 、 成 功 の 場 合 0 を 返 す 。

エ ラ ー の 場 合 は -1 を 返 し 、 errno を 適 切 に 設 定 す る 。

エ ラ ー

EACCES

IPC_STAT or SHM_STAT is requested and shm_perm.mode does not allow read access for shmid , and the calling process does not have the CAP_IPC_OWNER capability in the user namespace that governs its IPC namespace.

EFAULT

cmd 引 数 に IPC_SET IPC_STAT が 指 定 さ れ た が buf で 指 さ れ て い る ア ド レ ス に ア ク セ ス で き な い 。

EIDRM

shmid が 削 除 (remove) さ れ た 識 別 子 (identifier) を 指 し て い る 。

EINVAL

shmid が 有 効 な 識 別 子 で な い か 、 cmd が 有 効 な コ マ ン ド で な い 。 も し く は 、 操 作 SHM_STAT SHM_STAT_ANY の 場 合 に 、 shmid で 指 定 さ れ た イ ン デ ッ ク ス 値 が 現 在 未 使 用 の 配 列 の ス ロ ッ ト を 参 照 し て い た 。

ENOMEM

(2.6.9 以 降 の カ ー ネ ル に お い て ) SHM_LOCK が 指 定 さ れ 、 ロ ッ ク さ れ る 予 定 の セ グ メ ン ト の サ イ ズ (ロ ッ ク さ れ る 共 有 メ モ リ ー セ グ メ ン ト の 合 計 バ イ ト 数 ) が 、 呼 び 出 し た プ ロ セ ス の 実 ユ ー ザ ー ID に つ い て の 制 限 を 超 え た 。 こ の 制 限 は RLIMIT_MEMLOCK ソ フ ト 資 源 制 限 で 定 義 さ れ る ( setrlimit (2) を 参 照 )。

EOVERFLOW

IPC_STAT が 試 み ら れ 、 GID や UID の 値 が buf で 指 示 さ れ る 構 造 体 に 格 納 す る に は 大 き 過 ぎ る 。

EPERM

IPC_SET IPC_RMID が 試 み ら れ 、 呼 び 出 し た プ ロ セ ス の 実 効 ユ ー ザ ー ID が 作 成 者 ( shm_perm.cuid ) で も 所 有 者 ( shm_perm.uid ) で も な く 、 プ ロ セ ス が 特 権 を 持 た な い (Linux で は CAP_SYS_ADMIN ケ ー パ ビ リ テ ィ を 持 た な い )。

ま た は (2.6.9 よ り 前 の カ ー ネ ル で ) SHM_LOCK ま た は SHM_UNLOCK が 指 定 さ れ て い る が 、 プ ロ セ ス が 特 権 を 持 た な い (Linux で は CAP_IPC_LOCK ケ ー パ ビ リ テ ィ を 持 た な い )。 (Linux 2.6.9 以 降 で は 、 RLIMIT_MEMLOCK が 0 で 呼 び 出 し 元 が 特 権 を 持 た な い 場 合 に も 、 こ の エ ラ ー が 起 こ る 。 )

準 拠

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

注 意

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

IPC_INFO , SHM_STAT , SHM_INFO 操 作 は 、 ipcs (1) プ ロ グ ラ ム で 割 り 当 て 済 の 資 源 に 関 す る 情 報 を 提 供 す る た め に 使 用 さ れ て い る 。 将 来 、 こ れ ら の 操 作 は 変 更 さ れ た り 、 /proc フ ァ イ ル シ ス テ ム の イ ン タ ー フ ェ ー ス に 移 動 さ れ る か も し れ な い 。

Linux で は 、 shmctl(IPC_RMID) を 使 っ て す で に 削 除 マ ー ク が つ け ら れ て い る 共 有 メ モ リ ー セ グ メ ン ト を あ る プ ロ セ ス が 付 加 (attach) ( shmat (2)) す る こ と を 許 可 し て い る 。 こ の 機 能 は 他 の UNIX の 実 装 で は 利 用 で き な い 。 移 植 性 を 考 慮 し た ア プ リ ケ ー シ ョ ン で は こ れ に 依 存 し な い よ う に す べ き で あ る 。

構 造 体 shmid_ds 内 の 多 く の フ ィ ー ル ド は 、 Linux 2.2 で は short 型 だ っ た が 、 Linux 2.4 で は long 型 に な っ た 。 こ の 利 点 を 生 か す に は 、 glibc-2.1.91 以 降 の 環 境 下 で 再 コ ン パ イ ル す れ ば 十 分 で あ る 。 カ ー ネ ル は 新 し い 形 式 の 呼 び 出 し と 古 い 形 式 の 呼 び 出 し を cmd 内 の IPC_64 フ ラ グ で 区 別 す る 。

関 連 項 目

mlock (2), setrlimit (2), shmget (2), shmop (2), capabilities (7), sysvipc (7)

こ の 文 書 に つ い て

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