在用户空间 Linux 中,我有一个进程阻塞在信号量上,如 strace 所发现的。一旦发生错误情况,阻塞是可重复的,因此必须有另一个进程持有信号量并且没有释放它。
有没有办法知道哪个其他进程当前持有信号量?
ipcs
列出信号量,/proc/sysvipc/sem 也是如此。我在哪里可以找到有关持有过程的信息?
信号量不是互斥体。你不“持有”他们。如果进程被阻塞,这意味着它正在等待其他人将来对其进行“向上”或“V”操作。没有内核工具可以告诉您软件的未来行为将是什么。
要查找与列出的信号量数组列表关联的 pid,ipcs -s
您可以运行以下命令:
for pid in $( for semid in $( sudo ipcs -s | awk '/0x/{ print $2 }' ); do sudo ipcs -s -i $semid | tail -2 | head -1 | awk '{print $5}'; done | sort -u ); do ps uh -p $pid; done
可能有更简单的方法,但您可以将 semctl() 调用与 GETPID cmd 一起使用。这应该返回为信号量执行最后一次 semop() 调用的进程。这可能是也可能不是您的流氓进程,但这可能是一个很好的提示。
“ipcs -p”不能显示进程持有的信号量,那一定是一个错误,或者它是一个限制,因为它很难显示。您必须自己查询。
注意:如果进程只是读取信号量,那么您可能无法通过 ipcs 命令获取此类信息。
你试过了吗
ipcs -p