2016-04-27 74 views
-2

我已經設置了多個阻塞讀取串口並通過使用setitimer()超時。當我讀完時(或超時過期,並且read()返回EINT),我寫了一條不同的消息,重新啓動警報並開始再次讀取。但是,現在我已經發現了一個問題 - 當兩次讀取之間的警報到期時,我該怎麼辦?我現在想停下來,但我只想去看下。 (塞汀一些標誌只想改變這個問題:「我應該怎麼做,如果報警和標誌之間到期讀?」)通過報警中斷多個讀取

+1

哪裏碼?我們需要看到[MCVE](http://www.stackoverflow.com/help/mcve)。參見[如何提問](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通過串口描述符的死描述。這將確保下一個readwrite失敗並返回該函數。
  4. 爲了把事情恢復正常,dup2串口描述符的副本保存在一個你殺了。
+0

你還是不明白我的意思:/。我不想打斷一個閱讀。我想讓中斷讓我們說一個函數,它由多個讀取()(和寫入)組成。當在read()中間發出警報「buzzes」時,我可以在超時時跟蹤EINTR螞蟻返回錯誤,但是當我不讀取()時報警「蜂鳴」,我真的很想立即返回錯誤。 – Charlestone

+0

查看我的更新。這應該做到這一點。 –