2016-04-27 16 views
-2

setitimer()を使用してシリアルポートで複数のブロッキング読み取りをタイムアウトさせました。読み込みが終了すると(またはタイムアウトが終了し、read()がEINTを返します)、私は別のメッセージを書き、アラームを再起動して再度読み込みを開始します。しかし、私は今問題が発生しました。アラームが2回の読み取りの間に期限切れになったら、どうすればいいですか?私は今停止したいですが、私はちょうど次の読んでそれに行くでしょう。 (いくつかのフラグを設定すると、「フラグと読み取りの間にアラームが期限切れになったら、どうすればよいですか」という質問に変わります)。複数の読み取りがアラームによって中断されました

+1

コードはどこですか? [MCVE](http://www.stackoverflow.com/help/mcve)を見る必要があります。 [How to Ask](http://www.stackoverflow.com/help/how-to-ask)を参照してください。 – CodeMouse92

+1

アラームは何を意味しますか?何かが間違っていることを意味しますか?もしそうなら、失敗に対処する必要はありませんか? –

+0

"setitimer()を使ってタイムアウトしています"。タイムアウトを実装するより良い方法があります。入力が利用可能になるのを待つには、['select'](http://linux.die.net/man/2/select)を使用してください。 'select'はタイムアウトをサポートしています。 – kaylum

答えて

0

あなたがしたいことをする方法はありますが、醜い。

  1. パイプを作成します。その書き込み終了を閉じます。そうすれば、死んで無駄なディスクリプタを得ることができます。
  2. シリアルポートのディスクリプタをとり、dupコピーを保存します。
  3. 割り込みハンドラで、dup2シリアルポート記述子のデッドディスクリプタ。これにより、次のreadまたはwriteが失敗し、関数が返されます。
  4. 物事を正常に戻すために、dup2は、あなたが殺したものよりもシリアルポート記述子の保存されたコピーを保存します。
+0

あなたはまだ私を得ない:/。私は1つの読書を中断したくない。私は複数の読み込み()からなる関数を言うことを中断させたい(そして(あまりにも)書き込む)。 read()の途中でアラームが「鳴る」と、タイムアウト時にEINTR antのリターンエラーを追跡できますが、私がread()していないときにアラームが「鳴っている」ときは、エラーをすぐに返したいと思います。 – Charlestone

+0

私の更新を参照してください。それはそれを行う必要があります。 –

関連する問題