sil*_*ttt 7 linux semaphore kill-process spinlock process-exit
如果一个进程持有一些自旋锁或信号量,并意外退出(例如,被linux杀死),linux会正确释放这些锁吗?如果linux没有做到这一点,为什么?
bdo*_*lan 10
这取决于你所谈论的锁的类型.
如果您正在讨论任何类型的内核锁定,它们将在适当时释放(因为您的系统很快就会崩溃).通常,这种类型的锁不是由进程本身拥有,而是由某些内部内核工作流拥有,并且通常在进程返回到用户空间之后不会保持锁定状态.
但请注意,如果在发出kill时内核已经死锁,则很可能不会终止该进程.进程终止作为信号处理路径的一部分执行,该路径从内核到用户空间返回转换代码调用.如果进程正在等待内核自旋锁,则永远不会将其转换为返回代码,因此进程不会退出.
另外,如果进程因内核OOPS而被终止,那么所有的注意都被关闭 - 内核已经处于不一致状态,并且OOPS退出代码不会非常努力地清理内核线程可能已经存在的任何锁定当时举行.
如果您正在谈论任何类型的用户空间自旋锁或信号量(包括sem_*IPC信号量系列),不会,它们将不会被释放,因为没有信号量锁拥有的概念.
如果您正在讨论flock文件锁系列或fcntl(F_SETLK, ...)建议锁定,那么当关闭该进程中绑定到该文件的任何文件描述符时,它们将自动释放.因此,flock在大多数情况下使用是一个坏主意,但是,如果进程被终止,它将被释放.
如果你在谈论一个过程本地的pthread_mutex,那就没有实际意义了,因为互斥体将随着这个过程而不复存在.
如果你在谈论pthread_mutex共享内存段中的共享(其中一个pthread_mutexattr_setpshared已经用于使其可共享),它将被自动释放,只有当它也被标记为强健互斥体时,pthread_mutexattr_setrobust- 但它必须在之前标记为一致再利用; pthread_mutex_consistent有关详细信息,请参见联机帮助
| 归档时间: | 
 | 
| 查看次数: | 4358 次 | 
| 最近记录: |