2017-01-09 9 views
1

私は質問が新しくないと思います:Xサーバ(XCB経由)とTCPに接続された別のサーバから読み取るべきスレッドがあるので、selectを呼び出す必要があります。selectとxcb_poll_for_eventを一緒に使用する安全な方法はありますか?

私が混乱しているのは、プログラムがselectから復帰したときに、Xサーバのリンクにデータがあるということです。データがXCBイベントに十分でない場合はどうなりますか?この場合、xcb_poll_for_event()はNULLを返さなければなりませんが、プログラムが再びselectを呼び出すと、何らかのデータがあるためブロックされません。したがって、プログラムは "ビジー"待機状態にトラップされます。

これは有効な懸念事項ですか?各XCBイベントは多くのバイトで構成されているため、送信中にサーバーが中断される可能性があるので、私はそう信じています。

答えて

0

どうのsetsockopt()を使用してXCBイベントの必要なサイズとXCBのFD用SO_RCVLOWATの設定について。現在、ソケットのファイルディスクリプタは、読み取るデータ量が少なくともある場合にのみ、読み取り可能として選択されます。これは、TCPサーバを扱うときに使用した通常の方法ですが、XCB fdでこれを試していません。

+0

ありがとうございました。以前はこのオプションについてはわかりませんでしたが、ここではXCBイベントに必要なバイト数を予測できません。 http://man7.org/linux/man-pages/man7/socket.7.htmlによると、このオプションは期待どおりに機能していないようですか? "現在、select(2)とpoll(2)システムコールは、LinuxではSO_RCVLOWAT設定を無視し、1バイトのデータでもソケットを読み取り可能とマークします。バイトが利用可能です。 – Danath

関連する問題