我正在实现一个充当fifo的模块,为了防止两个进程访问一个用于读/写的缓冲区,我使用了一个信号量,当一个信号量阻塞一个进程时,它会将它移到等待队列中,我的问题是,当那个进程在等待时,我如何检查它是否接收到一个信号,因为如果它接收到了,那么我想停止该进程正在执行的操作(读或写)并返回错误。
我唯一熟悉的功能是sigpinding(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);
}
....

关于linux - 我如何检查进程在等待队列中是否有信号linux 2.4,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21063881/

10-14 17:59
查看更多