msgsnd() - メッセージ送信操作

標準

標準/拡張機能 C/C++ 依存項目

XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _XOPEN_SOURCE
#include <sys/msg.h>

int msgsnd(int msgid, const void *msgp, size_t msgsz, int msgflg);

機能説明

msgsnd() 関数を使用すると、msgid で指定されている メッセージ・キュー ID に関連するキューにメッセージを 送信することができます。

引数の msgp は、メッセージの型を指定する long int 型のフィールドを最初に含み、次にメッセージのデータ・バイトを保持するデータ部分を含む必要のある、ユーザー定義バッファーを指定します。次の構造体は、このユーザー定義バッファーの指定の例です。
struct message 
{
    long int   mtype;    Message type
    int        mtext[n];  Message text
}

構造体メンバーの mtype は、メッセージ選択用の プロセスの受信で使用することができるゼロ以外の正の値でなければなりません。構造体メンバーの mtext は、msgsz バイト長の 任意のテキストです。

引数の msgsz は、mtext のサイズ (バイト) を指定します。mtext を指定しないで mtype だけが送信される と、msgsz がゼロに設定されます。引数の範囲は、ゼロから、システムに課せられた最大値、つまり メッセージ・キューに許可された最大バイト数まで可能です。

引数の msgflg は、以下の 1 つ以上が 該当する場合に行われるアクションを指定します。
  • メッセージ・キューにメッセージを入れることにより、メッセージ・キューの現在のバイト数 (msg_cbytes) が このキューに許可された最大バイト数 (msg_qbytes で指定) を 超えることになる。
  • キューのメッセージの合計数がシステムに課せられた 制限と同じである。
これらのアクションは以下のとおりです。
  • IPC_NOWAIT フラグが msgflg で オンになっている場合、メッセージは送信されず、呼び出しプロセスがただちに戻る。 msgsnd() は、-1 を戻して、errno に EAGAIN を設定する。
  • IPC_NOWAIT フラグが msgflg で オフの場合、呼び出しプロセスは、以下のいずれかが起こるまで 実行を中断する。
    1. 中断の原因となった条件がもはや存在しない。この場合、メッセージは送信される。
    2. メッセージ・キュー ID の msgid が システムから取り除かれる。つまり、これが起こると、errno が EIDRM に 設定され、-1 の値が戻される。
    3. 呼び出しプロセスが、キャッチされる予定のシグナルを 受信する。この場合、メッセージは送信されず、呼び出しプロセスは実行を再開する。-1 の値が戻され、エラーが EINTR に設定される。
正常に終了した場合は、以下のアクションが、msgid に関連するデータ構造体の msqid_ds に対してとられます。
  1. msg_qnum が 1 だけ増える。
  2. msg_lspid が、呼び出しプロセスのプロセス ID と等しく 設定される。
  3. msg_stime が、現行時間と等しく設定される。

戻り値

正常に実行された場合、msgsnd() は 0 を戻します。

正常に実行されなかった場合、メッセージは送信されないで、msgsnd() は -1 を戻し、errno を以下の値のいずれかに設定します。
エラー・コード
説明
EACCES
呼び出しプロセスに、メッセージ・キュー ID msgid に関連した メッセージ・キューへの書き込み許可がありません。あるいは、メッセージ・キューが IPC_SNDTYPEPID で作成され、さらに MSG_TYPE が呼び出し元のプロセス ID (JRTypeNotPID) ではありませんでした。
EAGAIN
メッセージは上記のいずれかの理由で送信できず、IPC_NOWAIT が指定されていました。
EIDRM
msgsnd() の呼び出し元が待機している間に、メッセージ・キュー ID の msgid がシステムから 取り除かれました。
EINTR
msgsnd() 関数はメッセージを送信する前に、シグナルで 割り込まれました。
EINVAL
引数の msgid の値が有効な メッセージ・キュー ID ではありません。つまり、mtype の値 が 1 よりも小さい、あるいは、msgsz の値がゼロよりも 小さいか、システムに課せられた制限を超えています。
ENOMEM
msgsnd() 関数を完了するための十分なシステム・ストレージがありません。

関連情報