Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ msgop(2V) — NEWS-os 4.2.1R

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

intro(2)

msgctl(2V)

msgget(2V)

signal(2)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026