我正在实现一个充当fifo的模块,以防止两个进程访问用于读/写我使用信号量的缓冲区,当信号量阻塞进程时它将其移动到等待队列中,我的问题是我如何检查当该进程等待时它收到了一个信号,因为如果它确实那么我想停止那个进程正在做什么(读或写)并返回错误。 我熟悉的唯一功能是sigpending(sigset_t * set),但我不确定如何使用它,任何帮助将不胜感激。 (当我说读/写我的意思是在fops中为模块实现的功能)
答案 0 :(得分:1)
要允许睡眠任务在收到信号时被唤醒,请将任务状态设置为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);
}
....