如何显示当前持有信号量的进程?

时间:2009-09-11 13:54:57

标签: linux semaphore

在用户空间Linux中,我有一个阻塞信号量的进程,如strace所见。一旦出现错误情况,阻塞就是可重复的,因此必须有另一个进程来保存信号量并且不会释放它。

有没有办法知道哪个其他进程当前持有信号量?

ipcs列出了信号量,/ proc / sysvipc / sem也是如此。我在哪里可以找到关于持有过程的信息?

5 个答案:

答案 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查询。

  1. run" ipcs -s"获得所有semid
  2. 对于每个semid运行" ipcs -s -i"
  3. 每个semnum,获得所有者pid, 如果您想要所有者pid,则显示当前的semid和semnum。
  4. 注意:如果进程只读取信号量,那么您可能无法通过ipcs命令获取此类信息。

答案 4 :(得分:0)

你试过吗

ipcs -p