MSGOP(2V) — NEWS-OS Programmer’s Manual
名称
msgsnd, msgrcv − メッセージの操作
形式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(msqid, msgp, msgsz, msgflg)
int msqid;
struct msgbuf ∗msgp;
int msgsz, msgflg;
int msgrcv(msqid, msgp, msgsz, msgtyp, msgflg)
int msqid;
struct msgbuf ∗msgp;
int msgsz;
long msgtyp;
int msgflg;
解説
msgsnd は msqid で指定する メッセージキュー識別子 に対応する キューにメッセージを送ります。 msgp はメッセージを持つ構造体を示します。 この構造体は 以下のメンバより構成されます。
longmtype;/∗ message type ∗/
charmtext[];/∗ message text ∗/
mtype は正の整数で、受信するプロセスが メッセージを選択するのに使われます。( msgrcv 参照) mtext は msgsz バイトの長さの テキストです。 msgsz は 0 から システムの限界の最大値までとなります。
msgflg は、以下の 1 つでも該当する場合の動作を指定します。
キューにあるバイト数 が msg_qbytes と同じ。( intro(2) 参照)
システム全体での全ての キューのメッセージの総数が システムの最大値と同じである。
以下にこれらの場合の動作を示します。
(msgflg & IPC_NOWAIT) が真であれば、 そのメッセージは送信されず、 呼び出しプロセスに即時戻ります。
(msgflg & IPC_NOWAIT) が偽であれば、 以下の 1 つでも発生するまで呼び出し プロセスは実行を停止します。
メッセージの送信をさまたげる条件 がなくなった。この場合には メッセージは返信される。
msqid がシステムから取り除かれた ( msgctl(2V) 参照) この場合、 errno は EIDRM と同等となり、−1 が返される。
呼び出しプロセスが シグナルを受信した。 この場合、 メッセージは送られず、 呼び出しプロセスは signal(2) で規定された方法で実行を再開する。
以下の内 1 つでも該当すれば、 msgsnd の実行に失敗し、メッセージは送信されません。
[EINVAL] msqid が有効なメッセージキュー識別子ではない。
[EACCES] 操作許可が呼び出しプロセス に対して認められない。( intro(2) 参照)
[EINVAL] mtype が 1 以下である。
[EAGAIN] 上記の 1 つの理由により、 メッセージが送られず、 (msgflg & IPC_NOWAIT) が真である。
[EINVAL] msgsz がゼロ以下、または システムの最大値以上である。
[EFAULT] msgp が不正なアドレスを示している。
コマンドの実行に成功した場合、 msqid に対応するデータ構造体に次のような動作が 行われます。( intro(2) 参照)
msg_qnum が 1 増やされる。
msg_lspid が呼び出しプロセスの プロセス ID に設定される。
msg_stime が現在時刻に設定される。
msgrcv は msqid で指定されるメッセージキュー識別子に 対応するキューから メッセージを読み取り、 それを msgp によって示される構造体に格納します。 この構造体は以下の メンバから構成されます。
longmtype;/∗ message type ∗/
charmtext[];/∗ message text ∗/
mtype は送信プロセスによって 指定される受信メッセージの タイプです。 mtext はメッセージのテキストです。 msgsz は mtext のバイト数を指定します。 受信メッセージが msgsz よりも長く、 (msgflg & MSG_NOERROR) が 真である場合には、 msgsz のバイト数に切り詰められます。 切取られた部分は消失し、 呼び出しプロセスには 知らされません。
msgtyp は以下のように要求メッセージ のタイプを指定します。
msgtyp が 0 である場合、 キュー上の最初の メッセージが受信されます。
msgtyp が 0 より大きい場合、 最初のタイプが msgtyp のメッセージが 受信されます。
msgtyp が 0 より小さい場合、 msgtyp の絶対値以下の最も小さい タイプ の最初のメッセージ が受信されます。
希望のタイプのメッセージが キュー上に無い場合、 msgflg が行う動作を以下に示します。
(msgflg & IPC_NOWAIT) が真であれば、 呼び出しプロセスに リターン値 −1 で返り、 errno が ENOMSG に設定されます。
(msgflg & IPC_NOWAIT) が偽であれば、 以下の 1 つが発生するまで 実行を停止します。
希望するタイプの メッセージがキュー 上に設定される。
msqid がシステムから 取り除かれる。 そのような場合、 errno が EIDRM に設定され、−1 が返される。
呼び出しプロセス がシグナルを受信する。 この場合、 メッセージは受信されず、 呼び出しプロセスは signal(2) で述べた方法で実行を再開します。
以下の 1 つでも該当する場合、 msgrcv は失敗し、 メッセージが受信されません。
[EINVAL] msqid は有効なメッセージキュー 識別子ではない。
[EACCES] 操作許可が呼び出しプロセス に対して認められない。
[EINVAL] msgsz が 0 より小さい。(負である)
[E2BIG] mtext が msgsz より大きく、 (msgflg & MSG_NOERROR) が偽である。
[ENOMSG] そのキューが希望のタイプの メッセージを持ってなく、 (msgtyp & IPC_NOWAIT) が真である。
[EFAULT] msgp が不正なアドレスを示している。
コマンドの実行に成功すると、 msqid (intro(2) 参照) に対応するデータ構造体に次の ような 動作が行われます。
msg_qnum が 1 減らされる。
msg_lrpid が呼び出しプロセスの プロセス ID に設定される。
msg_rtime が現在時刻に設定される。
リターン値
シグナルの受信によって msgsnd または msgrcv から返ると、−1 が返り、 errno が EINTR に設定されます。 システムから msqid 除去されたことによって返ると、−1 が返され、 errno が EIDRM に設定されます。
コマンドの実行に成功すると、 リターン値は以下のようになります。
msgsnd は 0 を返します。
msgrcv は mtext に実際に設定されたバイト数を返します。
失敗すれば、−1 が返され、 errno が設定されます。
関連事項
intro(2), msgctl(2V), msgget(2V), signal(2).
NEWS-OSRelease 4.2.1R