wait_event_interruptible返回-ERESTARTSYS(-512)

最近做一个驱动,在等待FPGA结果的时候调用wait_event_interruptible,期望能进入睡眠状态,并且在需要的时候可以使用ctrl+c杀死进程,但是在使用过程中发现wait_event_interruptible一直返回-ERESTARTSYS(-512)值,究其原因是因为在wait_event_interruptible里会调用signal_pending(current)检查当前进程是否有pending的信号,所以改写一个wait函数,专门等待结果或者KILL信号和SIGINT信号(ctrl+c发送的信号)。

inline void wait_result(wait_queue_head_t *wq, int condition)
{
    DEFINE_WAIT(__wait);
    
    if (!(condition)) {
        for (;;) {
            prepare_to_wait(wq, &__wait, TASK_INTERRUPTIBLE);
            if (condition)
                break;
            DEBUG("schedule before");
            schedule();
            DEBUG("schedule after");
            break;
        }
        finish_wait(wq, &__wait);
    }
    
    return;
}

在wait_result函数后面,判断是否有pending信号,如果pending的信号是SIGKILL或者SIGINT,则系统调用返回,回到用户层,就会执行信号处理函数,这里默认会退出进程。

if(signal_pending(current)) {
if (sigismember(&current->pending.signal, SIGKILL) || sigismember(&current->pending.signal, SIGINT)) {
     ret = -EAGAIN;
     return ret;
 }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值