【发布时间】:2012-10-29 19:47:03
【问题描述】:
许多 POSIX 阻塞函数在收到信号时返回 EINTR。这个想法是信号处理程序首先设置一个标志(在 SIGINT 的情况下说“停止”标志),然后阻塞函数解除阻塞返回 EINTR 并且应用程序看到该标志并执行有序关闭(或其他)。
但是,对于一些阻塞函数,例如 pthread_mutex_lock 和 pthread_cond_wait,没有 EINTR 错误。
这背后的想法是什么?使用这些函数的应用程序应该如何处理信号(特别是 Ctrl+C)?
【问题讨论】:
-
好吧,想象一下
pthread_mutex_lock()是可中断的。如果它被中断,下面的代码应该做出什么假设?互斥锁是锁定的还是解锁的?或者可能是介于两者之间......周围的代码如何重新启动操作? EINTR 并不总是打算请求关闭,很多时候重试是适当的操作...... -
pthread_cond_wait() 在这里更有趣,因为它旨在等待无限的时间。