如何避免由于Linux中的信号而中断睡眠呼叫

我在Linux中使用实时信号来通知串口中新数据的到达。 不幸的是,当有信号时,会导致睡眠呼叫中断。 有没有人知道一种方法来避免这种行为。

编辑:我试过使用一个常规的信号(SIGUSR1),但我一直得到相同的行为。

谢谢Joao

Solutions Collecting From Web of "如何避免由于Linux中的信号而中断睡眠呼叫"

从nanosleep手册:

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

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

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

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

无论是在Rockind的“高级Unix编程”还是Steven的书中,都有一个如何伪装的例子。 你开始睡觉之前记下当前的time_t。 睡眠结束后,检查确保所需的时间已过,如果没有,则开始新的睡眠。 把睡眠计算在一个循环中,计算出去的时间和睡眠的数量,并在需要的时间过后退出。

那么,实时信号应该会中断睡眠。 您可以使用非实时信号。 另一种方法是检查预期的睡眠时间是否已经过去,如果没有,则睡眠剩余的时间间隔。