使用睡眠并选择信号

我想使用select()函数等待1秒,因为我的程序使用信号来控制东西,所以sleep()会过早地返回。 奇怪的是,当使用select()它也会过早地返回。

我打电话选择这样的

 struct timeval timeout; timeout.tv_sec = 10; timeout.tv_usec = 1000000; select (0 ,NULL, NULL, NULL, &timeout); 

但每当信号到达时,它返回(我正在使用纳秒计时器作为信号)

谁知道为什么?

尝试这样的事情:

 struct timespec timeout; timeout.tv_sec = 10; timeout.tv_nsec = 0; while (nanosleep(&timeout, &timeout) && errno == EINTR); 

指向nanosleep的“剩余时间”指针将nanosleep让你重新启动睡眠,如果它被中断则需要剩余的时间。

man 7 signal说:

信号处理程序中断系统调用和库函数

如果在阻止系统调用或库函数调用时调用信号处理程序,则:

  * the call is automatically restarted after the signal handler returns; or * the call fails with the error EINTR. 

发生这两种行为中的哪一种取决于接口以及是否使用SA_RESTART标志建立了信号处理程序(请参阅sigaction(2))。 UNIX系统的细节各不相同; 下面是Linux的详细信息。

如果对信号处理程序中断对以下某个接口的阻塞调用,则在使用SA_RESTART标志后,如果信号处理程序返回,则调用将自动重新启动; 否则呼叫将失败并显示错误EINTR

通常,检查返回值是否为-1并且errno == EINTR然后重新调用该函数是纠正此问题的正确方法。