最近做一个驱动,在等待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(¤t->pending.signal, SIGKILL) || sigismember(¤t->pending.signal, SIGINT)) {
ret = -EAGAIN;
return ret;
}
}