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

时间:2014-01-11 15:08:10

标签: linux process linux-kernel kernel-module

我正在实现一个充当fifo的模块,以防止两个进程访问用于读/写我使用信号量的缓冲区,当信号量阻塞进程时它将其移动到等待队列中,我的问题是我如何检查当该进程等待时它收到了一个信号,因为如果它确实那么我想停止那个进程正在做什么(读或写)并返回错误。 我熟悉的唯一功能是sigpending(sigset_t * set),但我不确定如何使用它,任何帮助将不胜感激。 (当我说读/写我的意思是在fops中为模块实现的功能)

1 个答案:

答案 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);
}
....