Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ msgop(2V) — NEWS-os 4.1C

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

名称

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

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