EN JA
MSGSND(2)
MSGSND(2) FreeBSD System Calls Manual MSGSND(2)

名称

msgsndメッセージキューにメッセージを送る

ライブラリ

Standard C Library (libc, -lc)

書式

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

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

解説

msgsnd() 関数は、 msqid で指定されているメッセージキューへメッセージを送ります。 msgp 引数は、メッセージを含む構造体を指します。この構造体は、次のメンバから構成されるべきです:

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

mtype は、メッセージを選択するために使用することができる 0 より大きな整数 ( msgrcv(2) 参照) で、 mtext は、 msgsz バイトの配列です。引数 msgsz は、0 からシステムに課された最大の MSGMAX までの範囲を指定できます。

メッセージキューのバイト数と msgsz の合計が、既にメッセージキューのバイトの最大数より大きいか、 ( msg_qbytesmsgctl(2) 参照) またはシステム全体のすべてのキューのメッセージ数が、システム制限と既に等しくなっているなら、 msgflg は、 msgsnd() の動作を決定します。 msgflgIPC_NOWAIT マスクが設定されているなら、呼び出しは、直ちに返ります。 msgflgIPC_NOWAIT が設定されていないなら、呼び出しは、次の状態になるまでブロックされます:

  • 呼び出しがブロックを引き起こした条件は、もはや存在しません。メッセージは、送られます。
  • メッセージキューは、削除され、この場合、-1 が返され、 errno は、 EINVAL に設定されます。
  • 呼び出し側は、シグナルを捕獲しました。呼び出しは、 errnoEINTR を設定して返ります。

成功した呼び出しの後に、メッセージキューに関連するデータ構造体は、次の方法で更新されます:

  • msg_cbytes は、メッセージのサイズだけ増加されます。
  • msg_qnum は、1 だけ増加されます。
  • msg_lspid は、呼び出しプロセスの pid に設定されます。
  • msg_stime は、現在の時刻に設定されます。

戻り値

The msgsnd() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

msgsnd() 関数は、次の場合に失敗します:
[ EINVAL]
msqid 引数が有効なメッセージキュー識別子ではありません。

msgsnd() がメッセージを配信するために使用可能となるリソースを待っている間に、メッセージキューが、削除されました。

msgsz 引数が、 msg_qbytes より大きいです。

mtype 引数が、0 より大きくありません。

[ EACCES]
呼び出しプロセスには、メッセージキューの書き込みアクセス権がありません。
[ EAGAIN]
キューまたは全体のシステムに、このメッセージのための空間がなく、 IPC_NOWAIT が、 msgflg に設定されていました。
[ EFAULT]
msgp 引数が不正なアドレスを指しています。
[ EINTR]
システムコールが、シグナルの配信によって割り込まれました。

歴史

メッセージキューは、AT&T Unix System V の最初のリリースで登場しました。

バグ

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