在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>
答案 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。