是否为 C++11 中的信号中断(或信号处理程序)定义了 std::this_thread::sleep_for 行为?

Posted

技术标签:

【中文标题】是否为 C++11 中的信号中断(或信号处理程序)定义了 std::this_thread::sleep_for 行为?【英文标题】:Is std::this_thread::sleep_for behaviour defined for signal interupt ( or signal handler) in C++11? 【发布时间】:2018-10-18 07:08:00 【问题描述】:

sleep()unistd.h 中的行为在 Linux http://man7.org/linux/man-pages/man3/sleep.3.html 中得到了很好的定义。

问题:

    C++11 标准是否为信号中断/信号处理程序定义了std::this_thread::sleep_for 的行为? 如果是,行为平台是否依赖? (希望不会)

    在 Linux 中实现不可中断的sleep() 的最佳方法是什么?据我所知,这可以通过在调用 sleep() 之前阻止所有信号来完成。

【问题讨论】:

【参考方案1】:

C++11 标准是否为信号中断/信号处理程序定义了 std::this_thread::sleep_for 的行为?

没有。

行为平台是否依赖?

由于未指定,所以可以。

我在linux上测试过,确实有信号提前中断了睡眠。

在 Linux 中实现不可中断的 sleep() 的最佳方法是什么?

最佳做法是不需要不可中断的sleepsleep如果被中断返回睡眠剩余时间,所以为了防止过早唤醒,你可以简单地在中断后使用循环恢复睡眠:

int time = 10;
while(time = sleep(time));

不幸的是,this_thread::sleep_for 并非如此,它不会返回中断时剩余的时间。

【讨论】:

以上是关于是否为 C++11 中的信号中断(或信号处理程序)定义了 std::this_thread::sleep_for 行为?的主要内容,如果未能解决你的问题,请参考以下文章

Unix环境_信号处理机制

Linux 信号编程

Linux 上的 Ctrl+C 等终止信号或中断

Linux -- 信号编程

C语言中,用于设置中断、中断信号的函数都有哪些?怎么设置一个发送中断信号(自己定义的)的函数?

中断简介