4

最近、私にとってまったく新しい問題を発見しました。アドバイスをいただければ幸いです。Linuxでtermios関数を使用してシリアル通信を行っています。私は実際には実際のシリアルポートを使用していませんが、仮想ガジェットのシリアルドライバーを使用しています/dev/ttyGS0。ファイル記述子は非ブロッキングとして開かれます。

私のプログラムは定期的にデータを生成し、それを/ dev/ttyGS0に送信します。もう一方の端がそれを読み取るかどうかについての情報はありません。そうでない場合、一部の内部FIFOがいっぱいになり、書き込みは「ブロックします」エラーを返します。これまでのところ、問題はありません。

問題は、そのようなファイル記述子をいっぱいのFIFOで閉じたい場合、関数ブロックを閉じることです!無期限ではありませんが、約10秒間です。

tcflush(uart->fd, TCOFLUSH)何の効果もなく閉じる前にやろうとしました。

これは私にとって非常に奇妙な振る舞いであり、説明が見つからなかったため、閉じるとブロックされる可能性があります。これを回避する方法はありますか?または、少なくともこのタイムアウトを減らしますか?このタイムアウトはどこで探す必要がありますか?VTIME属性もこれに影響を与えません。

4

3 に答える 3

2

Amardeep が述べたように、close() 呼び出しはドライバーによって処理されます。Close 自体は常にブロッキング呼び出しですが、通常は高速です。

したがって、答えは、遅延は仮想ガジェット ドライバーに固有のものであるということです。私はそれを助ける経験がありません。

ファイルを閉じることはどれほど重要ですか? 遅延が重大な問題であり、ファイルを閉じる必要がある場合 (実行時間の長いプロセスでのファイル記述子のリークを回避するなど)、おそらく別のスレッドで閉じる必要があります。明らかに、最良の答えはそのドライバーに固有のものです。仮想デバイスの状態をクリアする ioctl() 呼び出しなどの調査により、答えが得られる可能性があります。

于 2013-08-21T18:41:36.990 に答える