スポンサーリンク

SHMCTL(2) FreeBSD システムコールマニュアル SHMCTL(2)

名称

shmctl − 共有メモリ制御

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <machine/param.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int

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

解説

shmid によって指定された共有メモリセグメント上で cmd によって指定された処 理を実行します:

       IPC_STAT

struct shmid_ds のセグメントを取得し、 buf によって指定され たメモリにそれを保存します。

IPC_SET
struct shmid_ds
セグメントの shm_perm.uid, shm_perm.gid, お よび shm_perm.mode の各メンバを buf で指された構造体のメンバ に変更します。呼び出しプロセスの実効ユーザ ID は、 shm_perm.uid または shm_perm.cuid のどちらかと一致するか、ま たはスーパユーザ特権を持っている必要があります。

IPC_RMID
システムからセグメントを除去します。セグメントにアタッチした すべてのプロセスが終了するまで、除去は行われません。しかし、 いったん IPC_RMID 操作が実行されると、それ以降プロセスはその セグメントにアタッチすることを許されません。操作が成功するた めには、呼び出しプロセスの実効ユーザ ID が shm_perm.uid また は shm_perm.cuid と一致するか、または呼び出しプロセスにスー パユーザ特権が必要です。

shmid_ds 構造体は次のように定義されます:

struct shmid_ds {
struct ipc_perm shm_perm; /* 操作パーミッション構造体 */
int shm_segsz; /* セグメントのサイズ (バイト単位) */
pid_t shm_lpid; /* 最後の共有メモリ操作のプロセス ID */
pid_t shm_cpid; /* 作成者のプロセス ID */
short shm_nattch; /* 現在のアタッチの数 */
time_t shm_atime; /* 最後の shmat() の時刻 */
time_t shm_dtime; /* 最後の shmdt() の時刻 */
time_t shm_ctime; /* shmctl() による最後の変更の時刻 */
void *shm_internal; /* SystemV の愚行 */
};

戻り値

関数 shmctl() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。

エラー

shmctl() システムコールは次の場合に処理に失敗します:

       [EINVAL]

無効な操作、または shmid に指定された共有メモリセグメ ントが検出されませんでした。

[EPERM]
呼び出しプロセスの実効ユーザ ID が、共有メモリセグメン トの所有者または作成者のユーザ ID と一致しません。

[EACCES]
操作と共有メモリセグメントモードの間の不一致のために パーミッションが拒絶されました。

関連項目

shmat(2), shmdt(2), shmget(2), ftok(3)

FreeBSD 10.0 July 17, 1995 FreeBSD 10.0

スポンサーリンク