1

消費したいメッセージ(整数)がキューにあり、整数を使用して消費したメッセージの数を追跡したいと思いますint consumed

ds.msg_qnum > 0最初に、dsがstructmsqid_dsのオブジェクトである場合にキューにメッセージがあるかどうかを検出します。メッセージがある場合は、msgrcvを呼び出してメッセージを消費し、消費されたカウンターをインクリメントします。

だから私はこれを持っています:

msgrcv(msgqid, (void *) &message, sizeof(message), 1, 0)
printf("consumed before incr: %d\n", consumed);
consumed++;

そして、消費されると、メッセージが消費されるたびに同じランダムな整数値として表示されます。また、メッセージ構造体をint型としてメッセージデータを保持するように設定しました。それが喫煙銃かどうかはわかりません。

4

1 に答える 1

3

への呼び出しmsgrcvは無効です。サイズパラメータが間違っています:

struct mymsg {
    long    mtype;     /* Message type. */
    char    mtext[1];  /* Message text. */
}

[...]引数msgszは、mtextのサイズをバイト単位で指定します。

msgbuf.mdata構造体全体のサイズではなく、のサイズを渡す必要があります。これは、最後を過ぎて上書きし、messageそこに保存されているものが何であれ文字化けする可能性があります。

message.mtype(呼び出す前に必ず初期化してくださいmsgrcv。)

于 2012-05-18T07:10:52.357 に答える