我正在实现一个充当FIFO的模块,以防止两个进程访问用于读取/写入的缓冲区,我使用了信号量,当信号量阻止进程时,它会将其移动到等待队列中,我的问题是如何检查该进程正在等待时是否收到了信号,因为如果确实如此,那么我想停止该进程是什么执行(读取或写入)并返回错误。我唯一熟悉的功能是 sigpending(sigset_t *set),但我不确定如何使用它,任何帮助将不胜感激。(当我说读/写时,我指的是在 FOPS 中为模块实现的功能)
要允许休眠任务在收到信号时被唤醒,请将任务状态设置为 TASK_INTERRUPTIBLE
而不是 TASK_UNINTERRUPTIBLE
。这种信号唤醒完全独立于任何等待队列,因此必须单独检查(使用 signal_pending()
)。
典型的等待循环如下所示:
DECLARE_WAITQUEUE(entry, current);
...
if (need_to_wait) {
add_wait_queue(&wq, &entry);
for (;;) {
set_current_state(TASK_INTERRUPTIBLE);
if (!need_to_wait)
break;
schedule();
if (signal_pending(current)) {
remove_wait_queue(&wq, &entry);
return -EINTR; /* or -ERESTARTSYS */
}
}
set_current_state(TASK_RUNNING);
remove_wait_queue(&wq, &entry);
}
....