4

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

我这样称呼选择

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

但是每当信号到达时,它就会返回(我正在使用纳秒计时器来接收信号)

有谁知道为什么?

4

2 回答 2

6

尝试这样的事情:

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

如果睡眠中断,“剩余时间”指针nanosleep将负责让您以必要的剩余时间重新启动睡眠。

于 2011-03-04T21:35:24.060 回答
5

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 然后重新调用该函数是纠正此问题的正确方法。

于 2011-03-04T19:56:34.163 回答