使用睡眠并选择信号
我想使用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然后重新调用该函数是纠正此问题的正确方法。