SHMCTL(2)

名前
shmctl - 共有メモリ(shared memory)を制御する

書式
#include <sys/ipc.h>

#include <sys/shm.h>

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

説明
shmctl() はユーザーが共有メモリ・セグメントの情報を得たり、 共有メモリーの所有者(owner)、グループ(group)、および許可(permission)を 設定するこを許す。shmidで指定されたセグメントについての情報は shmid_ds 構造体に返される:

struct shmid_ds {
	struct	ipc_perm shm_perm;	/* operation perms */
	int	shm_segsz;		/* size of segment (bytes) */
	time_t	shm_atime;		/* last attach time */
	time_t	shm_dtime;		/* last detach time */
	time_t	shm_ctime;		/* last change time */
	unsigned short	shm_cpid;	/* pid of creator */
	unsigned short	shm_lpid;	/* pid of last operator */
	short	shm_nattch;		/* no. of current attaches */
	/* the following are private */
	unsigned short   shm_npages;  /* size of segment (pages) */
	unsigned long   *shm_pages;
	struct shm_desc *attaches;    /* descriptors for attaches */
};

shm_perm メンバーの内容は:

struct ipc_perm
{
  key_t  key;
  ushort uid;   /* owner euid and egid */
  ushort gid;
  ushort cuid;  /* creator euid and egid */
  ushort cgid;
  ushort mode;  /* lower 9 bits of access modes */
  ushort seq;   /* sequence number */
};

以下の cmds が使用できる:

IPC_STAT
    は共有メモリ・セグメントを buf バッファーにコピーするために 使用する。ユーザーは共有メモリ・セグメントに対する読み込み アクセスができなければならない。

IPC_SET
    はユーザーが shm_perms の uid、gid、mode を変更 するために使用する。modeは下位 9ビットのみが使用される。 shm_ctime も更新される。ユーザーは所有者(owner)か作成者(creator)か スーパー・ユーザー(super-user)でなければならない。

IPC_RMID
    はセグメントに破壊(destroy)マークを付けるのに使用する。実際には 最後の分離(detach)が行なわれた(関連する shmid_ds 構造体の shm_nattch メンバーがゼロになった)後に破壊される。ユーザーは所有者か作成者か スーパー・ユーザーでなければならない。

ユーザーは最終的にはセグメントを忘れずに破壊しなければならない。 そうでなれば、破壊されなかったページはスワップ(swap)かメモリーに残り続ける。

加えて、以下の cmds で、スーパー・ユーザーは 共有メモリ・セグメントがスワップされることを妨げたり、許したりでできる: (Linux のみ)

SHM_LOCK
    は共有メモリ・セグメントをスワップすることを妨げる。 ユーザーはロックが可能になった後にロックを要求したページが 存在することを確認しなければならない。

SHM_UNLOCK
    は共有メモリ・セグメントをスワップ・アウトすることを可能にする。

IPC_INFO、 SHM_STAT、 SHM_INFO 制御コールは ipcs(8) プログラムによって割り当てられた資源についての情報を提供するために 使用される。将来的にはこれらは proc ファイル・システム・インターフェース を使用したものに修正されるかもしれない。

システム・コール

fork()
    fork() の後に、子プロセスは付加(attach)された共有メモリ・セグメントを継承する。

exec()
    exec() の後に、 は全ての付加された共有メモリ・セグメントは分離(detach)される。 (破壊はされない)。

exit()
    exit() において、 全ての付加された共有メモリ・セグメントは分離される。(破壊はされない)。

返り値
成功した場合は 0 を返し、エラーの場合は -1 を返す。

エラー
エラーの場合は errno が以下のどれかに設定される:

EACCES
    は IPC_STAT が要求され、shm_perm.modes が shmid への読み込みアクセスを許していなかった場合に返される。

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

EINVAL
    は shmid が有効な識別子(identifier)でないか、cmd が 有効なコマンドでない場合に返される。

EIDRM
    は shmid が削除(remove)された識別子を指している 場合に返される。

EPERM
    は IPC_SET か IPC_RMID が試みられ、ユーザーが 所有者でも作成者でもスーパー・ユーザーでもなく、ユーザーが グループや他者として許可を得ていない場合に返される。

準拠
SVr4, SVID. SVr4 には他に EINVAL, ENOENT, ENOSPC, ENOMEM, EEXIST エラーについての記述がある。SVr4 および SVID には EIDRM エラーについての記述はない。

関連項目
shmget(2), shmop(2)