2017-02-28 11 views
0

シリアルポートを非同期で使用しようとしています。私は、selectpoll、またはepollO_NONBLOCKを使って、非同期の読み書きを行うことができます。しかし、opencloseについてはどうですか?シリアルポートを非同期で `open`と` close`する方法は?

私はcloseブロックを1秒以上見てきました。

+0

なぜ非ブロッキングfdsでポーリングAPI( 'select'、' poll'など)を使いたいのですか?次の書き込み/読み込みがブロックされてはならないときはいつでも戻りますが、ブロックされていないfdsでは読み込みがないのに常にこれが戻ります。 – silen

+0

私は100%のCPUを望んでいないので、私は複数のfdを持っています。 – kptlronyttcna

+1

私が言いたいのは、 'select'はfdが読み込み可能であるのを待たず、次の読み込みがブロックされない瞬間を待つことです。これは常に' O_NONBLOCK'ファイル記述子のためです。 – silen

答えて

1

真の非同期open()close()を(O_NONBLOCKopen()を達成するための手段を指定すると、接続または入力を待って寝ていない、実際にはバックグラウンドで真の操作を実行しない)を実装非常に少数のオペレーティングシステムがあります。心に浮かぶのは、QNXとHurdです。どちらも、すべてのシステムコールが定義可能で、したがって非同期であるマイクロカーネルオペレーティングシステム設計です。

理由は、open()が完了するまで歴史的に何もできないため、APIデザイナーはこれを非同期にすることは考えていませんでした。最近では、実際に非同期にしたい場合は、スレッドプールから呼び出しを行います。 close()はもう少し興味深いですが、実際にはファイルディスクリプタをすばやく閉じることで貴重な情報を失わずにデータディスクの損失を招くことなく、ファイルディスクリプタをすばやく閉じることはかなり難しいです。 "私が書き出しようとしたバッファリングされたデータは失敗しました"。しかし、実際にclose()を非同期にする必要がある場合は、スレッドプールから呼び出してください。

open()close()を多く呼び出すと、一般的に高性能は期待できません。どちらも、カーネルに多くのコードチェックパーマネントを実行させ、カーネル構造を割り当て、カーネル構造をロックするなどの必然的な作業が必要です。一般に、高性能ファイルI/Oの場合は、最初に必要なファイルを開き、ほとんどのオペレーティングシステムで優れたパフォーマンスが得られます。

関連する問題