我有一个线程连续读取数据的串行端口。 如果主程序收到SIGINT,它会在串口线程上调用g_thread_join()。中断读取()信号
但是,由于读是阻塞的串口线程将不会返回和程序停滞,直到我在串行线上获得一个字节,然后它可以退出。
有没有办法将SIGINT传递给read(),以便在主线程需要它时可以强制返回它?
我有一个线程连续读取数据的串行端口。 如果主程序收到SIGINT,它会在串口线程上调用g_thread_join()。中断读取()信号
但是,由于读是阻塞的串口线程将不会返回和程序停滞,直到我在串行线上获得一个字节,然后它可以退出。
有没有办法将SIGINT传递给read(),以便在主线程需要它时可以强制返回它?
accepted answer对于上一个implementing timeout for read() when reading from a serial port问题显示了如何使用select(2)
执行超时读取。因此,您发送的SIGINT信号将最终执行。
要有read()
回报EINTR
,未设置SA_RESTART
构件中的struct sigaction
安装信号处理程序SIGINT
时传入呼叫sigaction()
的sa_flags
。
另一种方法是根本避免阻塞read()
。请参阅此问题的答案:how to avoid blocking from the read function?
这会有帮助吗? http://stackoverflow.com/questions/10522277/how-can-i-implement-timeout-for-read-when-reading-from-a-serial-port-cc - 它告诉你如何阅读与超时,所以SIGINT最终会被应用 –
你应该有一些事件循环并使用[poll(2)](http://man7.org/linux/man-pages/man2/poll.2.html)。 –
不,您无法将信号传递给线程。而是使用定时读取(上图),或者使用eventfd()或类似的方法来轮询两个描述符,并使用其中一个唤醒。 –