如何避免因Linux中的信号导致睡眠呼叫中断?

jas*_*cao 9 c linux signals

我正在Linux中使用实时信号来通知串行端口中新数据的到来.不幸的是,这会导致睡眠呼叫在有信号时被中断.

有人知道避免这种行为的方法吗?

我尝试使用常规信号(SIGUSR1),但我仍然保持相同的行为.

Mar*_*oek 14

来自nanosleep手册页:

nanosleep延迟程序的执行至少在*req中指定的时间.如果已将信号传递给过程,则该函数可以更早地返回.在这种情况下,它返回-1,将errno设置为EINTR,并将剩余时间写入rem指向的结构,除非rem为NULL.然后可以使用*rem的值再次调用nanosleep并完成指定的暂停.

  • 我不会,但我更愿意在接受答案之前等待一段时间。 (2认同)

dma*_*a_k 8

您可以SIGKILL使用sigprocmask()signal()调用几乎所有信号(除外).第一个将返回您之前的掩码,您可以在之后恢复sleep().这里有一些例子.如果这没有帮助,请详细说明什么信号会打断你的睡眠.我想,您还可以检查这种情况("睡眠被信号中断?")并再次进入睡眠状态.


Nik*_*sov 5

较新的Linux内核支持signalfd(2).这与sigprocmask(2)一起,是在单个epoll_wait(2)调用中组合处理信号和IO事件的一种非常好的方法.

  • 便携性是一个光荣的,但并不总是第一个目标. (4认同)