在用户空间Linux中,我有一个阻塞信号量的进程,如strace所见。一旦出现错误情况,阻塞就是可重复的,因此必须有另一个进程来保存信号量并且不会释放它。
有没有办法知道哪个其他进程当前持有信号量?
ipcs
列出了信号量,/ proc / sysvipc / sem也是如此。我在哪里可以找到关于持有过程的信息?
答案 0 :(得分:5)
信号量不是互斥量。你不“抓住”它们。如果进程被阻止,这意味着它正在等待其他人在将来对其进行“向上”或“V”操作。没有内核工具可以告诉您软件的未来行为。
答案 1 :(得分:3)
可能有一种更简单的方法,但您可以使用带有GETPID cmd的semctl()调用。这应该返回执行信号量的最后一次semop()调用的进程。这可能是也可能不是你的流氓程序,但它可能是一个很好的暗示。
答案 2 :(得分:3)
要找到与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
列出的信号量数组列表相关联的pid,您可以运行此命令:
{{1}}
答案 3 :(得分:1)
" ipcs -p"无法显示流程持有的信号量,必须是一个错误,或者它是一个限制,因为它很难显示。 你必须通过yourslef查询。
注意:如果进程只读取信号量,那么您可能无法通过ipcs命令获取此类信息。
答案 4 :(得分:0)
你试过吗
ipcs -p