我正在实现一个充当 fifo 的模块,为了防止两个进程访问用于读/写的缓冲区,我使用了一个信号量,当一个信号量阻塞一个进程时,它会将它移动到等待队列中,我的问题是我如何检查该进程是否在等待时收到信号,因为如果收到信号,我想停止该进程正在做的事情(读取或写入)并返回错误。 我熟悉的唯一功能是 sigpending(sigset_t *set) 但我不确定如何使用它,我们将不胜感激。 (当我说读/写时,我指的是在 fops 中为模块实现的功能)
最佳答案
要允许 sleep 任务在收到信号时被唤醒,请将任务状态设置为 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);
}
....
关于linux - 我如何检查进程在等待队列 linux 2.4 中时是否收到信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21063881/