使用睡眠并选择信号

Ser*_*amá 3 c sleep signals select-function

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

我打电话选择这样的

struct timeval timeout;    
timeout.tv_sec = 10;  
timeout.tv_usec = 1000000; 
select (0 ,NULL, NULL, NULL, &timeout);
Run Code Online (Sandbox Code Playgroud)

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

谁知道为什么?

小智 5

man 7 signal说:

\n\n
\n

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

\n\n

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

\n\n
   * the call is automatically restarted after the signal handler\n     returns; or\n\n   * the call fails with the error EINTR.\n
Run Code Online (Sandbox Code Playgroud)\n\n

发生这两种行为中的哪一种取决于接口以及信号处理程序是否是使用 SA_RESTART 标志建立的(请参阅 sigaction(2))。\n 详细信息因 UNIX 系统\xe2\x80\x90\n 项目而异;下面是 Linux 的详细信息。

\n\n

如果对以下接口之一的阻塞调用被信号处理程序中断,则如果使用了 SA_RESTART 标志,则该调用将在信号处理程序返回后自动重新启动;否则调用将失败并出现错误 EINTR

\n
\n\n

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

\n


R..*_*R.. 5

尝试这样的事情:

struct timespec timeout;
timeout.tv_sec = 10;
timeout.tv_nsec = 0;
while (nanosleep(&timeout, &timeout) && errno == EINTR);
Run Code Online (Sandbox Code Playgroud)

"剩余时间"指针nanosleep将指示如果中断,则允许您以必要的剩余时间重新启动睡眠.