0
  1. msgrcv システムコールの msgtype とは何ですか? メッセージタイプの意味は何ですか? 初心者向けの言葉で説明してください?? int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

  2. 以下に示すように、メッセージキューに構造体を使用すると正しいですか

    struct mybuff { long mtype int flag char buff[50] }buf

    および msgsnd(msgid,&buf,sizeof(buf),0) の送信中

4

2 に答える 2

1

ドキュメントから:

引数 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)

于 2013-07-07T13:56:29.187 に答える
0

初心者の言語では、msgtype フィールドを使用すると、開発者は、キュー内のメッセージの処理方法を柔軟に設計できます。すべての型は、区別したいものを表す整数です。いくつかの使用例は次のとおりです。

(a)一種のメッセージ - たとえば、購入トランザクションと返金トランザクション。これにより、同じキューで 2 種類 (またはそれ以上の種類) のメッセージが許可されます。

(b) どのプロセスがメッセージを処理するべきかについての標識。このmsgrcv関数を使用して、特定の種類のメッセージのみを読み取ることができます。したがって、たとえば、クライアントは、購入、販売、払い戻し、ステータスなどの種類のメッセージを 1 つのキューに書き込むことができます。ただし、複数のプロセスは、関心のあるメッセージのみを探してそのキューを読み取ることができます。たとえば、BuyPgm は Buy トランザクションのみを読み取ります。

(c) 十分に考慮すれば、クライアントとサーバーの両方が同じキューを共有できる方法で msgtype を使用できます。通常、キューは先入れ先出しメカニズムであるため、クライアントは通常、1 つのキューを読み取り、他のプロセスが処理するための別のキューを書き込みます。書き込んだメッセージを読み取らないようにするために、2 つのキューが必要です。Msgtypes では、これを回避できます。たとえば、クライアントは 1 から 100 までの msgtypes でさまざまなメッセージを書き込むことができます。一部のプロセスは、これらのメッセージを処理し、結果の応答メッセージを msgtype 200..300 として書き込むことができます。元のクライアントは、200 ~ 300 の範囲内のものだけを読み取ることによって、最初に書き込んだのと同じキューで応答メッセージを受信できます。(または、作成した任意の msgtype プロトコル。)

(d) msg​​types を使用して、通常のキューを粗雑ではあるが効果的な優先キューに変えることができます。たとえば、すべての Order トランザクションのキューがある場合、重要な顧客が msgtype に基づいて最初に処理されるように msgtype プロトコルを設計します。

chisaycockは、キューを読み取るためのルールを投稿しました。一見難しそうに見えますが、実際にやってみると納得です。

于 2013-07-08T20:47:30.867 に答える