SVIPC(7)

名前
svipc - System V プロセス間通信機構

書式
#include <sys/msg.h>
#include <sys/sem.h>
#include <sys/shm.h>

説明
このマニュアルページは System V プロセス間通信 (interprocess communication; IPC) 機構の Linux に おける実装を説明する。 このプロセス間通信機構には、 メッセージキュー (message queue)、セマフォー集合 (semaphore set)、 共有メモリセグメント (shared memory segment) などがある。以下で 資源 (resource) という用語を使用した場合にはこれらの機構のどれかを意味する。

  資源へのアクセス許可
システムのそれぞれの資源は、IPC への操作を許可するかどうかを決定する ための情報を共通の構造体 struct ipc_perm に格納して使用する。 ipc_perm 構造体には以下のメンバーが定義されている:
struct ipc_perm {
    uid_t          cuid;   /* 作成者のユーザーID */
    gid_t          cgid;   /* 作成者のグループID */
    uid_t          uid;    /* 所有者のユーザーID */
    gid_t          gid;    /* 所有者のグループID */
    unsigned short mode;   /* 読み書きの許可 */
};

ipc_perm 構造体の mode メンバーは以下の 9 ビットで、プロセスの IPC システムコール による資源へのアクセス許可を定義する。 許可は以下のように解釈される:

    0400    ユーザーによる読み込み。
    0200    ユーザーによる書き込み。

    0040    グループによる読み込み。
    0020    グループによる書き込み。

    0004    他人による読み込み。
    0002    他人による書き込み。

システムはビット 0100, 0010, 0001 (実行ビット) は使用しない。 さらに、セマフォーの場合には "書き込み(write)" は実際には "変更(alter)" を意味する。

同じヘッダーファイルには以下のシンボルの定義が含まれている:

IPC_CREAT
    キー(key)が存在しない場合には新たなエントリを作成する。

IPC_EXCL
    キー(key)が存在する場合には失敗する。

IPC_NOWAIT
    要求が待たされる場合にはエラーになる。

IPC_PRIVATE
    プライベートキー。

IPC_RMID
    資源を削除する。

IPC_SET
    資源にオプションを設定する。

IPC_STAT
    資源のオプションを取得する。

IPC_PRIVATE は key_t 型である。その他の全てのシンボルはフラグフィールドとして int 変数に OR 演算で格納することができる。

  メッセージキュー
メッセージキューは正の整数 (msqid) によって識別され、 <sys/msg.h> に定義されている構造体 struct msqid_ds に結びつけられている。 この構造体は以下のメンバーを含んでいる:
struct msqid_ds {
    struct ipc_perm msg_perm;
    msgqnum_t       msg_qnum;    /* キューにあるメッセージの数 */
    msglen_t        msg_qbytes;  /* キューの最大バイト数 */
    pid_t           msg_lspid;   /* 最後に msgsnd(2) をした PID */
    pid_t           msg_lrpid;   /* 最後に msgrcv(2) をした PID */
    time_t          msg_stime;   /* 最後に msgsnd(2) をした時間 */
    time_t          msg_rtime;   /* 最後に msgrcv(2) をした時間 */
    time_t          msg_ctime;   /* 最後に変更された時間 */
};

msg_perm
    メッセージキューへのアクセス許可を指定する ipc_perm 構造体。

msg_qnum
    現在、このメッセージキューにあるメッセージの数。

msg_qbytes
    メッセージキューに入れることができるメッセージの最大バイト数。

msg_lspid
    最後に msgsnd(2) システムコールを行なったプロセスの ID。

msg_lrpid
    最後に msgrcv(2) システムコールを行なったプロセスの ID。

msg_stime
    最後に msgsnd(2) システムコールを行なった時間。

msg_rtime
    最後に msgrcv(2) を行なった時間。

msg_ctime
    最後に msqid_ds 構造体のメンバーが変更された時間。

  セマフォー集合
セマフォー集合は正の整数 (semid) によって識別され、 <sys/sem.h> に定義されている構造体 struct semid_ds に結びつけられている。 この構造体は以下のメンバーを含んでいる:
struct semid_ds {
    struct ipc_perm sem_perm;
    time_t          sem_otime;   /* 最後に操作した時間 */
    time_t          sem_ctime;   /* 最後に変更した時間 */
    unsigned long   sem_nsems;   /* 集合の中にあるセマフォー数 */
};

sem_perm
    セマフォー集合へのアクセス許可を指定する ipc_perm 構造体。

sem_otime
    最後に semop(2) システムコールを行なった時間。

sem_ctime
    最後に semctl(2) を行なって上記の構造体のメンバーを変更するか、セマフォー集合に属する セマフォーを変更した時間。

sem_nsems
    セマフォー集合の中にあるセマフォーの数。 集合の中にあるそれぞれのセマフォーは負でない整数によって参照され、 0 から sem_nsems-1 までの番号を持つ。

セマフォーは struct sem 型のデータ構造体であり、以下のメンバーを含んでいる:
struct sem {
    int semval;  /* セマフォーの値 */
    int sempid;  /* 最後に操作したプロセス ID */
};

semval
    セマフォー値: 負でない整数。

sempid
    このセマフォーを最後に操作したプロセスの ID。

  共有メモリセグメント
共有メモリセグメントは正の整数 (shmid) によって識別され、 <sys/shm.h> に定義されている struct shmid_ds 構造体に結びつけられている。 この構造体は以下のメンバーを含んでいる:
struct shmid_ds {
    struct ipc_perm shm_perm;
    size_t          shm_segsz;   /* セグメントのサイズ */
    pid_t           shm_cpid;    /* 作成者のプロセス ID */
    pid_t           shm_lpid;    /* 最後に操作したプロセス ID */
    shmatt_t        shm_nattch;  /* 現在、付加している数 */
    time_t          shm_atime;   /* 最後に付加した時間 */
    time_t          shm_dtime;   /* 最後に分離した時間 */
    time_t          shm_ctime;   /* 最後に変更した時間 */
};

shm_perm
    共有メモリセグメントへのアクセス許可を指定した ipc_perm 構造体。

shm_segsz
    共有メモリセグメントのバイト数。

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

shm_lpid
    最後に shmat(2) または shmdt(2) システムコールを実行したプロセスの ID。

shm_nattch
    この共有メモリセグメントをメモリに付加 (attach) しているプロセスの数。

shm_atime
    最後に shmat(2) システムコールを行なった時間。

shm_dtime
    最後に shmdt(2) システムコールを行なった時間。

shm_ctime
    最後に shmctl(2) システムコールを行なって、 shmid_ds 構造体を変更した時間。

関連項目
ipcmk(1), ipcrm(1), ipcs(1), ipc(2), msgctl(2), msgget(2), msgrcv(2), msgsnd(2), semctl(2), semget(2), semop(2), shmat(2), shmctl(2), shmdt(2), shmget(2), ftok(3)

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