Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all bug

名前

       msgctl - System V メッセージ制御操作

書式

       #include <sys/types.h>
       #include <sys/ipc.h>
       #include <sys/msg.h>

       int msgctl(int msqid, int cmd, struct msqid_ds *buf);

説明

       msgctl()    はメッセージ・キュー識別子  msqid  で指定された  System  V  メッセージ・キュー
       (message queue) に対して cmd で指定された制御操作を行なう。

       msqid_ds データ構造体は <sys/msg.h> で以下のように定義されている:

           struct msqid_ds {
               struct ipc_perm msg_perm;     /* 所有権と許可 */
               time_t          msg_stime;    /* 最後の msgsnd(2) の時刻 */
               time_t          msg_rtime;    /* 最後の msgrcv(2) の時刻 */
               time_t          msg_ctime;    /* 最後に変更が行われた時刻 */
               unsigned long   __msg_cbytes; /* キューにある現在のバイト数
                                                (非標準) */
               msgqnum_t       msg_qnum;     /* キューにある現在入っている
                                                メッセージの数 */
               msglen_t        msg_qbytes;   /* キューに許可されている
                                                最大バイト数 */
               pid_t           msg_lspid;    /* 最後の msgsnd(2) の PID */
               pid_t           msg_lrpid;    /* 最後の msgrcv(2) の PID */
           };

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

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

       cmd として有効な値は:

       IPC_STAT
              msqid に関連づけられたメッセージ・キュー・データ構造体から、ポインタ buf が指し示す
              msqid_ds 構造体に情報をコピーする。  呼び出し側はメッセージ・キューに対する読み込み
              許可を持っていなければならない。

       IPC_SET
              ポインタ buf が指し示す msqid_ds 構造体のメンバーの値を、メッセージ・キューに関連づ
              けられた カーネル・データ構造体に書き込み、 msg_ctime メンバーも更新する。 構造体の
              メンバーのうち、更新されるものを以下に示す: msg_qbytes, msg_perm.uid, msg_perm.gid,
              msg_perm.mode (の下位 9 ビット)。  呼び出したプロセスの実効ユーザ  ID  が、メッセー
              ジ・キューの所有者 (msg_perm.uid)  または作成者 (msg_perm.cuid)  と一致するか、呼び
              出し元が特権を持たなければならない。 msg_qbytes をシステム・パラメータの MSGMNB  を
              超えて設定するには、適切な特権    (Linux   では   CAP_IPC_RESOURCE   ケーパビリティ
              (capability)) が必要である。

       IPC_RMID
              メッセージ・キューをただちに削除する。 同時にその構造体の読み書きの待ち状態にあった
              プロセスに通知する  (エラーが返り、 errnoEIDRM に設定される)。 呼び出したプロセ
              スが適切な特権を持っているか、  呼び出したプロセスの実効ユーザ  ID   がメッセージ・
              キューの作成者か 所有者の実効ユーザ ID でなければならない。

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

                  struct msginfo {
                      int msgpool; /* メッセージ・データの保持に使用される
                                      バッファ・プールの大きさ (1024 バイト単位);
                                      カーネル内では未使用 */
                      int msgmap;  /* メッセージ・マップの最大エントリ数;
                                      カーネル内では未使用 */
                      int msgmax;  /* 一つのメッセージに書き込み可能な
                                      最大バイト数 */
                      int msgmnb;  /* 一つのキューに書き込み可能な最大バイト数;
                                      (msgget(2) での) キュー作成中の msg_qbytes
                                      の初期化に使用される */
                      int msgmni;  /* メッセージ・キューの数の最大値 */
                      int msgssz;  /* メッセージ・セグメントのサイズ;
                                      カーネル内では未使用 */
                      int msgtql;  /* システム上の全キューの最大メッセージ数;
                                      カーネル内では未使用 */
                      unsigned short int msgseg;
                                   /* 最大セグメント数; カーネル内では未使用 */
                  };

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

       MSG_INFO (Linux 固有)
              IPC_INFO のときと同じ情報を格納した msginfo 構造体を返す。 但し、以下のフィールドに
              はメッセージ・キューが 消費しているシステム資源に関する情報が格納される点が異なる。
              msgpool  フィールドは現在システム上に存在するメッセージ・キューの数を返す。  msgmap
              フィールドはシステム上の全てのキューに入っているメッセージ総数を返す。       msgtql
              フィールドはシステム上の全てのキューに入っている全メッセージの 総バイト数を返す。

       MSG_STAT (Linux 固有)
              IPC_STAT と同じく msqid_ds 構造体を返す。 但し、 msqid 引き数は、キュー識別子ではな
              く、システム上の全てのメッセージ・キュー に関する情報を管理するカーネルの内部配列へ
              のインデックスである。

返り値

       成功すると、 IPC_STAT, IPC_SET, IPC_RMID は 0 を返す。 IPC_INFOMSG_INFO 操作は、成功す
       ると、全てのメッセージ・キューに関する情報を  管理しているカーネルの内部配列の使用中エント
       リのインデックスの  うち最大値を返す (この情報は、システムの全てのメッセージ・キューに関す
       る情報を 取得するために、 MSG_STAT 操作を繰り返し実行する際に使用できる)。  MSG_STAT  操作
       は、成功すると、 msqid で指定されたインデックスを持つメッセージ・キューの識別子を返す。

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

エラー

       失敗した場合、 errno は以下の値の中のどれか一つに設定される:

       EACCES 引き数 cmdIPC_STAT または MSG_STAT に等しいが、呼び出したプロセスがメッセージ・
              キュー msqid に対する読み込み許可を持っておらず、かつ CAP_IPC_OWNER  ケーパビリティ
              を持っていない。

       EFAULT 引き数 cmdIPC_SETIPC_STAT で、ポインタ buf で指されているアドレスがアクセス
              可能でない。

       EIDRM  メッセージ・キューが削除された。

       EINVAL cmd または msqid に不正な値が設定された。 もしくは、 MSG_STAT 操作の場合に、  msqid
              で指定されたインデックス値が現在未使用の配列のスロットを参照いていた。

       EPERM  引き数  cmdIPC_SETIPC_RMID であるが、呼び出したプロセスの実効ユーザ ID が
              メッセージキューの (msg_perm.cuid として見つかる) 作成者 と (msg_perm.uid  として見
              つかる)    所有者のいずれでもなく、    かつ呼び出したプロセスに特権   (Linux   では
              CAP_SYS_ADMIN ケーパビリティ) がない。

準拠

       SVr4, POSIX.1-2001.

注意

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

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

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

関連項目

       msgget(2), msgrcv(2), msgsnd(2), capabilities(7), mq_overview(7), svipc(7)

この文書について

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