MSGSND(3)

名称
msgsnd - メッセージキューにメッセージを送信

書式
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgsnd(int msqid, void *msgp, size_t msgsz, int msgflg)

解説
msgsnd() 関数は、 msqid で指定されているメッセージキューからメッセージ を送信します。 msgp は、メッセージを含む構造体を指します。この構造体は、 以下のメンバから構成されている必要があります。

        long mtype;    /* メッセージタイプ */
        char mtext[1]; /* メッセージ本体 */

mtype は 0 より大きい整数で、メッセージの選択に使用されます ( msgrcv(3) 参照)。 mtext はバイトの配列で、システム制限 (MSGMAX) までのサイズです。

メッセージキューにすでに存在するバイト数と msgsz の合計が、メッセージキューの最大バイト数 (msg_qbytes 。 msgctl(3) 参照) より大きい場合、またはシステム全体のすべてのキューに存在する メッセージ数がシステム制限にすでに等しくなっている場合は、 msgflg が msgsnd() の動作を決めます。 msgflg で IPC_NOWAIT マスクが設定されている場合、呼び出しはすぐに戻されます。 msgflg で IPC_NOWAIT が設定されていない場合、呼出しは以下の状態になるまでブロックされます。

•   呼出しがブロックされる条件がなくなるまで。この条件がなくなると、 メッセージが送信されます。

•   メッセージキューが削除されるまで。この場合は -1 が戻され、 errno が EINVAL に設定されます。

•   呼び出し側がシグナルを受信するまで。呼び出しは、 errno が EINTR に設定された状態で戻ります。

呼び出しで問題が発生しなかった場合、メッセージキューに関連する データ構造は以下のように更新されます。

•   msg_cbytes が、メッセージのサイズだけ大きくなります。

•   msg_qnum に 1 が加えられます。

•   msg_lspid が呼び出しプロセスのプロセス ID に設定されます。

•   msg_stime が現在の時刻に設定されます。

戻り値
問題なく終了すると 0 が戻されます。問題が発生すると -1 が戻され、 errno がそのエラーを示すように設定されます。

エラー
msgsnd() は、以下のような場合にエラーとなります。

[EINVAL]
    msqid が正しいメッセージキュー ID でない場合。

    リソースが使用できるようになり、メッセージを送信できる 状態になることを msgsnd() が待っている間に、メッセージキューが削除された場合。

    msgsz が 0 より小さいか、 msg_qbytes より大きい場合。

[EACCES]
    呼出しプロセスにメッセージキューの書込み権がない場合。

[EAGAIN]
    キューかシステム全体にメッセージ用のスペースがなく、 msgflg で IPC_NOWAIT が設定されている場合。

[EFAULT]
    msgp が正しいアドレスを指していない場合。

[EINTR]
    システムコールが、シグナルの配送によって割り込まれた場合。

バグ
NetBSD と FreeBSD は、メッセージキューが削除された場合に使用すべきエラー値 EIDRM を定義していません。

歴史
メッセージキューは、 AT&T Unix System V の最初のリリースに 追加されました。