3

あと2つ質問があります。1. メッセージ キュー名をコマンド ライン引数として渡すにはどうすればよいですか? たとえば、私は次のように書きました。

char src[50] , dest[50];
strcpy(src , "/");
strcpy(dest , argv[1]); // argv[1] is the name of message queue
strcat(dest , src);
char *msgqueue;
strcpy(msgqueue , dest);

ただし、セグメンテーション違反が発生し、 char msgqueue[50] として変更すると、無効なエラーが発生します。

  1. メッセージ キュー内の要素数に到達するにはどうすればよいですか? m_attr.mq_msgsize を試しましたが、答えが得られないことがわかりました。

宿題を完了するための最後のステップなので、あなたの助けが必要です!

すべてをありがとう!

4

3 に答える 3

1
char *msgqueue; //allocate memory and then copy
strcpy(msgqueue , dest);  

また

  msgqueue=strdup(dest);    

また

Joachim Pileborgが示唆したように

これ以上の変更が必要ない場合は、msgqueue = dest;

そして、メッセージキューにコピーargv[1]して、最後に「/」を追加します。

char *msgqueue=malloc(strlen(argv[1])+3); //one for null byte and another one for / for safe use one extra byte

strcpy(msgqueue,argv[1]);
strcat(msgqueue,"/");  
于 2013-10-22T06:56:29.087 に答える
0

メッセージ キュー内の要素数に到達するにはどうすればよいですか? m_attr.mq_msgsize を試しましたが、答えが得られないことがわかりました。

現在キューにあるメッセージの数を意味していると思います。これに使用mq_getattrします。サーバーで既に使用mq_getattrしていますが、別のフィールドを見ています。あなたがしたいmq_curmsgs

mq_receives決して到着しないメッセージの受信をブロックしないように、サーバーで実行する必要がある正確な数を知りたいので、これを見たいと思います。これはそのための 1 つの方法ですが、サーバーがメッセージの数をチェックしてからクライアントがメッセージの書き込みを停止するまでの間に常に競合状態が発生するため、絶対確実というわけではありません。代替手段 (ポーリング、時間指定受信、mq_notify の非ブロッキング キューなど) はありますが、状況に応じて最も簡単なのは、クライアントがサーバーに "I'm done" を通知する別の種類のメッセージを送信することです。

于 2013-10-22T13:40:48.660 に答える