如何在C中创建不间断的睡眠?

时间:2015-04-25 04:28:12

标签: c sleep wait

我希望为我正在编写的程序创造一种不间断睡眠状态。有关如何创建此状态的任何提示或想法都会有所帮助。

到目前为止,我已经查看了wait.h中定义的wait_event()函数,但实现它的运气却很少。在尝试初始化我的等待队列时,编译器抱怨

warning: parameter names (without types) in function declaration static DECLARE_WAIT_QUEUE_HEAD(wq);

有没有人有使用wait_event()函数或创建不间断睡眠的经验?

3 个答案:

答案 0 :(得分:4)

您在include/linux/wait.h中查看的功能是Linux内核的内部功能。用户空间无法使用它们。

一般而言,不间断睡眠状态被认为是不合需要的。在正常情况下,除非意外(例如,通过尝试从未正确响应的存储设备读取,或通过使系统交换),它们不能由用户应用程序触发。

答案 1 :(得分:1)

您可以sleep'信号感知'。

sleep可能会被信号打断。在这种情况下,暂停将停止,sleep将返回,剩余时间仍然存在。应用程序可以选择处理通知的信号,如果需要,可以在剩余时间内恢复睡眠状态。

答案 2 :(得分:0)

实际上,您应该使用您正在处理的操作系统提供的同步对象,或者只是检查sleep功能的返回值。如果它返回大于零的值,则表示您的过程被中断。根据此返回值,通过传递delta(T-returnVal)作为参数再次调用sleep函数(可能在循环中,以防可能在该时间间隔内再次发生中断)

另一方面,如果你真的想要一个真正不间断的自定义睡眠功能,我可能会建议如下:

void uninterruptible_sleep(long time, long factor)
{
    long i, j;

     __asm__("cli"); // close interrupts

     for(i=0; i<time; ++i)
        for(j=0; j<factor; ++j)
           ;                   // custom timer loop

     __asm__("sti"); // open interrupts
 }

cli sti 是x86汇编指令,允许我们设置cpu的 IF (中断标志)。以这种方式,可以清除(cli)或设置(sti)所有中断。但是,如果您正在处理多处理器系统,则需要采取其他同步预防措施,因为这些指令仅对单个微处理器有效。而且,我上面提到的这种类型的功能将非常依赖于系统(cpu)。因为,内部循环需要一个时钟周期计数来测量精确的时间间隔(每秒执行指令数),具体取决于CPU频率。因此,如果你真的想摆脱所有可能的中断,你可以使用我上面建议的功能。但是要小心,如果你的程序在cli状态下遇到死锁情况,你需要重新启动你的系统。

(我编写的内联汇编语法是针对 gcc 编译器)