如何检查进程在等待队列 Linux 2.4 中时是否收到信号



我正在实现一个充当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);
}
....

最新更新