2014-02-21 68 views
3

我有一個線程連續讀取數據的串行端口。 如果主程序收到SIGINT,它會在串口線程上調用g_thread_join()。中斷讀取()信號

但是,由於讀是阻塞的串口線程將不會返回和程序停滯,直到我在串行線上獲得一個字節,然後它可以退出。

有沒有辦法將SIGINT傳遞給read(),以便在主線程需要它時可以強制返回它?

+1

這會有幫助嗎? http://stackoverflow.com/questions/10522277/how-can-i-implement-timeout-for-read-when-reading-from-a-serial-port-cc - 它告訴你如何閱讀與超時,所以SIGINT最終會被應用 –

+0

你應該有一些事件循環並使用[poll(2)](http://man7.org/linux/man-pages/man2/poll.2.html)。 –

+0

不,您無法將信號傳遞給線程。而是使用定時讀取(上圖),或者使用eventfd()或類似的方法來輪詢兩個描述符,並使用其中一個喚醒。 –

回答

3

要有read()回報EINTR,未設置SA_RESTART構件中的struct sigaction安裝信號處理程序SIGINT時傳入呼叫sigaction()sa_flags


另一種方法是根本避免阻塞read()。請參閱此問題的答案:how to avoid blocking from the read function?

+0

剛剛清除SA_RESTART時,我沒有得到它的工作。使用該方法時是否有任何問題需要注意,你知道嗎?謝謝! – evading

+0

@evading:看到你實施解決方案的源頭會有很大幫助。 – alk