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

标签 linux process linux-kernel kernel-module

我正在实现一个充当 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/

相关文章:

linux - 如何为 RISC-V 编译 Linux Kernel 4.20

c - 嵌套函数的主体保存在哪里?

linux - 新安装的 Grails 2.0.3 Ubuntu 看起来不错,但运行 grails 会在几秒钟后返回

python - 当输入停止时停止在远程服务器上跟踪文件使用 paramiko 和 Flask

java - 用 Java 将用户输入发送到控制台

c - 如何在Linux上运行以下消息队列?

c - 如何解释内核 panic ?

linux - grep 基于第一列

java - Spring和synchronized方法保证特定数量的方法同时执行

linux - 在 linux 中创建 react-native 应用程序时出错