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

Linux 如何显示当前持有信号量的进程?,linux,semaphore,Linux,Semaphore,在用户空间Linux中,我在信号量上有一个进程阻塞,strace发现了这一点。一旦出现错误情况,阻塞是可重复的,因此必须有另一个进程持有信号量而不释放它 有没有办法知道哪个进程当前持有该信号量 ipcs列出了信号量,/proc/sysvipc/sem也列出了信号量。在哪里可以找到等待过程的信息?您试过了吗 ipcs -p 信号量不是互斥体。你不能“抓住”他们。如果进程被阻止,这意味着它正在等待其他人在将来对其执行“向上”或“V”操作。没有内核工具可以告诉您软件的未来行为。可能有一种更简单的方法

在用户空间Linux中,我在信号量上有一个进程阻塞,strace发现了这一点。一旦出现错误情况,阻塞是可重复的,因此必须有另一个进程持有信号量而不释放它

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

ipcs
列出了信号量,/proc/sysvipc/sem也列出了信号量。在哪里可以找到等待过程的信息?

您试过了吗

ipcs -p

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

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

“ipcs-p”无法显示进程持有的信号量,这一定是一个错误,或者是一个限制,因为很难显示。 你必须自己提问

  • 运行“ipcs-s”以获得所有semid
  • 对于每个semid运行“ipcs-s-i”
  • 对于每个semnum,要获取所有者pid, 如果所有者pid是您想要的,则显示当前的semid和semnum

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

    要查找与ipcs-s所列信号量数组列表相关联的PID,您可以运行以下命令:

    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
    

    似乎不适用于信号量。我可以很好地看到密钥,但是ipcs-p-s不会产生任何输出。