我希望为我正在编写的程序创造一种不间断睡眠状态。有关如何创建此状态的任何提示或想法都会有所帮助。
到目前为止,我已经查看了wait.h中定义的wait_event()函数,但实现它的运气却很少。在尝试初始化我的等待队列时,编译器抱怨
warning: parameter names (without types) in function declaration
static DECLARE_WAIT_QUEUE_HEAD(wq);
有没有人有使用wait_event()函数或创建不间断睡眠的经验?
答案 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 编译器)