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_qbytes、 msgctl(2) 参照) またはシステム全体のすべてのキューのメッセージ数が、システム制限と既に等しくなっているなら、 msgflg は、 msgsnd() の動作を決定します。 msgflg に IPC_NOWAIT マスクが設定されているなら、呼び出しは、直ちに返ります。 msgflg に IPC_NOWAIT が設定されていないなら、呼び出しは、次の状態になるまでブロックされます:
- 呼び出しがブロックを引き起こした条件は、もはや存在しません。メッセージは、送られます。
- メッセージキューは、削除され、この場合、-1 が返され、 errno は、 EINVAL に設定されます。
- 呼び出し側は、シグナルを捕獲しました。呼び出しは、 errno に EINTR を設定して返ります。
成功した呼び出しの後に、メッセージキューに関連するデータ構造体は、次の方法で更新されます:
- 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 の最初のリリースで登場しました。バグ
NetBSD と FreeBSD は、削除されたメッセージキューの場合に使用すべき EIDRM エラー値を定義していません。July 9, 2009 | FreeBSD |