Down_Interruptible不工作

时间:2014-03-30 08:15:19

标签: c kernel-module

在Linux内核模块中,我试图更改代码:

down(&semaphore1);

down(&semaphore2);

   critical code here!

up(&semaphore2);

up(&semaphore1);

使用down_interruptible();

if(down_interruptible(&semaphore1))
   return -ERESTARTSYS;

if(down_interruptible(&semaphore2))
   return -ERESTARTSYS;

   critical code here!

up(&semaphore2);

up(&semaphore1);

这是从“已加盖”down切换到down_interruptible的正确方法吗?

我不明白return -ERESTARTSYS;是做什么的,但对我来说,它似乎让我的内核模块退出并允许内核做一些其他的东西,直到我的内核模块再次被唤醒,是吗? / p>

1 个答案:

答案 0 :(得分:3)

一切都很好,除了一个:你必须在第二次回归之前释放semaphore1:

if(down_interruptible(&semaphore1))
   return -ERESTARTSYS;

if(down_interruptible(&semaphore2)) {
   up(&semaphore1);
   return -ERESTARTSYS;
}

   critical code here!

up(&semaphore2);

up(&semaphore1);

有关使用情况的说明ERESTARTSYS请参阅the answer

通常,down_interruptible可能会被信号中断到用户空间应用程序。返回ERESTARTSYS,告诉内核处理信号并再次调用驱动程序。除非你发布semaphore1,否则第二次调用驱动程序会阻塞semaphore1。