9

在用户空间 Linux 中,我有一个进程阻塞在信号量上,如 strace 所发现的。一旦发生错误情况,阻塞是可重复的,因此必须有另一个进程持有信号量并且没有释放它。

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

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

4

5 回答 5

5

信号量不是互斥体。你不“持有”他们。如果进程被阻塞,这意味着它正在等待其他人将来对其进行“向上”或“V”操作。没有内核工具可以告诉您软件的未来行为将是什么。

于 2009-09-11T15:49:53.780 回答
4

要查找与列出的信号量数组列表关联的 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
于 2016-05-18T02:55:00.010 回答
3

可能有更简单的方法,但您可以将 semctl() 调用与 GETPID cmd 一起使用。这应该返回为信号量执行最后一次 semop() 调用的进程。这可能是也可能不是您的流氓进程,但这可能是一个很好的提示。

于 2009-09-12T04:00:08.890 回答
2

“ipcs -p”不能显示进程持有的信号量,那一定是一个错误,或者它是一个限制,因为它很难显示。您必须自己查询。

  1. 运行“ipcs -s”来获取所有的semid
  2. 对于每个 semid 运行“ipcs -s -i”
  3. 对于每个 semnum,获取所有者 pid,如果所有者 pid 是您想要的,则显示当前的 semid 和 semnum。

注意:如果进程只是读取信号量,那么您可能无法通过 ipcs 命令获取此类信息。

于 2015-11-22T16:51:23.680 回答
0

你试过了吗

ipcs -p
于 2009-09-11T14:07:18.797 回答