msgrcv システムコールの msgtype とは何ですか? メッセージタイプの意味は何ですか? 初心者向けの言葉で説明してください?? int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
以下に示すように、メッセージキューに構造体を使用すると正しいですか
struct mybuff { long mtype int flag char buff[50] }buf
および msgsnd(msgid,&buf,sizeof(buf),0) の送信中
2 に答える
ドキュメントから:
引数 msgtyp は、要求されたメッセージのタイプを次のように指定します。
*
msgtyp が 0 の場合、キュー内の最初のメッセージが読み取られます。
*
msgtyp が 0 より大きい場合、msgflg で MSG_EXCEPT が指定されていない限り、タイプ msgtyp のキュー内の最初のメッセージが読み取られます。この場合、タイプが msgtyp と等しくないキュー内の最初のメッセージが読み取られます。
*
msgtyp が 0 未満の場合、msgtyp の絶対値以下の最も低いタイプを持つキュー内の最初のメッセージが読み取られます。
また、ドキュメントから、 の 2 番目のパラメーターは、msgsnd()
この構造体へのポインターである必要があります。
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
};
mtext フィールドは配列 (またはその他の構造体) であり、そのサイズは負でない整数値である msgsz によって指定されます。
したがって、3 番目のパラメーターは、この構造全体のサイズではなく、. に続くすべてのサイズですmtype
。ですsizeof(buf)-sizeof(long)
。
初心者の言語では、msgtype フィールドを使用すると、開発者は、キュー内のメッセージの処理方法を柔軟に設計できます。すべての型は、区別したいものを表す整数です。いくつかの使用例は次のとおりです。
(a)一種のメッセージ - たとえば、購入トランザクションと返金トランザクション。これにより、同じキューで 2 種類 (またはそれ以上の種類) のメッセージが許可されます。
(b) どのプロセスがメッセージを処理するべきかについての標識。このmsgrcv
関数を使用して、特定の種類のメッセージのみを読み取ることができます。したがって、たとえば、クライアントは、購入、販売、払い戻し、ステータスなどの種類のメッセージを 1 つのキューに書き込むことができます。ただし、複数のプロセスは、関心のあるメッセージのみを探してそのキューを読み取ることができます。たとえば、BuyPgm は Buy トランザクションのみを読み取ります。
(c) 十分に考慮すれば、クライアントとサーバーの両方が同じキューを共有できる方法で msgtype を使用できます。通常、キューは先入れ先出しメカニズムであるため、クライアントは通常、1 つのキューを読み取り、他のプロセスが処理するための別のキューを書き込みます。書き込んだメッセージを読み取らないようにするために、2 つのキューが必要です。Msgtypes では、これを回避できます。たとえば、クライアントは 1 から 100 までの msgtypes でさまざまなメッセージを書き込むことができます。一部のプロセスは、これらのメッセージを処理し、結果の応答メッセージを msgtype 200..300 として書き込むことができます。元のクライアントは、200 ~ 300 の範囲内のものだけを読み取ることによって、最初に書き込んだのと同じキューで応答メッセージを受信できます。(または、作成した任意の msgtype プロトコル。)
(d) msgtypes を使用して、通常のキューを粗雑ではあるが効果的な優先キューに変えることができます。たとえば、すべての Order トランザクションのキューがある場合、重要な顧客が msgtype に基づいて最初に処理されるように msgtype プロトコルを設計します。
chisaycockは、キューを読み取るためのルールを投稿しました。一見難しそうに見えますが、実際にやってみると納得です。