我正在写一个昏昏欲睡的驱动程序。在这里,任何尝试写入设备文件的进程都应该休眠用户提供的“n”秒。Reader 进程应该唤醒所有等待的进程。
编写器代码:
printk("Invoking interruptible_timeout for device flag[%d] = %d\n", idn, flag[idn]);
long ret = wait_event_interruptible_timeout(wq[idn],flag[idn]==1,sec*HZ)/HZ;
//flag[idn]=0;
printk("timeout returned : %d idn = %d\n", ret, idn)
printk("writer : flag[%d] = %d\n", idn, flag[idn]);
retval=ret;
阅读器代码:
printk("waking up process with idn = %d\n", idn);
flag[idn]=1;
printk("reader : flag[%d] = %d \n", idn, flag[idn]);
wake_up_interruptible(&wq[idn]);
while(waitqueue_active(&wq[idn]));
flag[idn] = 0;
printk("returned from wake_up_interruptible \n");
printk("reader : flag[%d] = %d \n", idn, flag[idn]);
最初标志[0] = 0;所以所有的 writer 进程都处于休眠状态,直到条件 flag[idn] == 1 变为真。这按预期工作。
但是在阅读器代码中,我设置 flag[idn] = 1 并调用 wake_up_interruptible() 来唤醒所有在该条件下休眠的进程。但这并没有唤醒睡眠过程。但是,如果我在 while(waitqueue_active(&wq[idn])) 正下方取出 flag[idn] = 0,它正在工作,即函数正在唤醒睡眠进程。
为什么会这样?