スポンサーリンク

MSGSND(3) FreeBSD ライブラリ関数マニュアル MSGSND(3)

名称

msgsnd

ライブラリ

標準 C ライブラリ (libc, −lc) − メッセージキューにメッセージを送信

書式

#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_qbytesmsgctl(3) 参照) より大きい場合、また はシステム全体のすべてのキューに存在するメッセージ数がシステム制限にすで に等しくなっている場合は、 msgflgmsgsnd() の動作を決めます。 msgflg で IPC_NOWAIT マスクが設定されている場合、呼び出しはすぐに戻されます。 msgflg で IPC_NOWAIT が設定されていない場合、呼出しは以下の状態になるまで ブロックされます。

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

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

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

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

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

msg_qnum に 1 が加えられます。

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

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

戻り値

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

エラー

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

       [EINVAL]

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

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

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

mtype が 0 より大きくない場合。

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

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

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

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

バグ

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

歴史

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

FreeBSD 10.0 November 24, 1997 FreeBSD 10.0

スポンサーリンク