2014-02-21 67 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