MSGOP(2V) — NEWS-OS Programmer’s Manual
名称
msgop − メッセージの操作
形式
#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.1C