0
for (;;)
{
    if (msgrcv(msqid, &flag, sizeof(struct flags) - sizeof(long), 1, IPC_NOWAIT)>0)
           break;
}
    msgsnd(msqid, &message , sizeof(struct messages) - sizeof(long), 0);

IPC のaccept()ような機能がありますが、 IPC 用ですか? サーバーはクライアント接続を待機し、クライアントが接続されたときにのみデータをサーバーに送り返す必要があります。クライアントから無駄なデータを特別に送信し、無限ループでデータをチェックします(つまり、クライアントが接続されていることを意味します。これは非常に愚かなアルゴリズムです)。socketsmessage queues

4

1 に答える 1

0

いいえ、直接類似するものはありません。メッセージ キューは、接続指向のストリーム ソケット (などをサポートする) よりも、接続のないデータグラム ソケットに似ていますaccept()

一部の実装 (z/OS?) では、 でブロックされたプロセスの数が公開されてmsgrcvいます。これは探しているものと似ていますが、これは移植性がありません。

ご覧のとおり、2 つの簡単なオプションがあります。

まず、現在行っていることを実行しますが、サーバーの .xml ファイルで IPC_NOWAIT を実行しないでくださいmsgrcv。何もしていない場合、ループで回転しても意味がありません。クライアントが自分自身を発表するまでブロックします。(そして、クライアントからサーバーへの通信とサーバーからクライアントへの通信には、異なるメッセージ タイプを使用します。クライアントがサーバーへのメッセージを消費したり、その逆をしたりすることは望ましくありません。)

次に、AF_UNIX ストリーム ソケットに切り替えます。これにより、有効accept()なセマンティクスが得られます。

于 2013-05-14T19:31:53.860 に答える