C 为什么Linux内核中的wait\u event\u interruptable()从未在while循环中使用?

C 为什么Linux内核中的wait\u event\u interruptable()从未在while循环中使用?,c,linux,linux-kernel,mutex,interrupt,C,Linux,Linux Kernel,Mutex,Interrupt,查看Linux内核,我发现wait\u event\u interruptible()的返回值几乎总是由if-块检查,而不是while循环: if (mutex_lock_interruptible(lock)) { return -ERESTARTSYS; } 为什么不在while循环中检查返回值并继续尝试,即使等待被信号处理程序中断?为什么驱动程序编写器要返回-ERESTARTSYS以重新启动系统调用?这不是更贵吗 while (mutex_lock_interruptible(loc

查看Linux内核,我发现
wait\u event\u interruptible()
的返回值几乎总是由
if
-块检查,而不是while循环:

if (mutex_lock_interruptible(lock)) {
  return -ERESTARTSYS;
}
为什么不在while循环中检查返回值并继续尝试,即使等待被信号处理程序中断?为什么驱动程序编写器要返回
-ERESTARTSYS
以重新启动系统调用?这不是更贵吗

while (mutex_lock_interruptible(lock)) {
  // 
}

系统调用必须返回,以便用户空间可以处理该信号。如果使用while循环,这将使等待不间断。

感谢您的快速响应!不知何故,我想象在内核模式下运行的任务也会被信号打断。因此,被信号中断的mutex\u lock\u interruptable()调用仅仅意味着一个信号已经到达,并且锁没有被获取,这取决于驱动程序编写器来决定是否返回到用户模式来处理信号?驱动程序肯定不会对信号进行操作,而是将操作留给用户空间。因此,驱动程序在等待之前已经知道它是否可以被中断,以便调用适当的可中断或不可中断等待/互斥。关于
等待事件\u可中断()
互斥锁\u可中断()
的问题也是如此?