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

时间:2010-02-08 18:04:33

标签: c linux signals

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

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

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

5 个答案:

答案 0 :(得分:14)

来自nanosleep手册页:

  

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

答案 1 :(得分:8)

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

如果您不想被打断,为什么要使用实时信号?

某处,无论是在Rockind的“高级Unix编程”还是史蒂文的书中,都有一个如何伪造它的例子。在开始睡眠之前记下当前的time_t。睡眠结束后,检查以确保所需的时间已过,如果没有,则开始新的睡眠。将睡眠放在一个循环中,计算出去睡觉的时间,然后在所需的时间过后退出。

答案 4 :(得分:2)

嗯,实时信号应该打断睡眠。您可以使用非实时信号。另一种方法是检查预期的睡眠时间是否已经过去,如果没有,则休眠一段时间。