gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:12 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com