9
votes

Comment afficher le processus tenant actuellement un sémaphore?

Dans UserSpace Linux, j'ai un processus de blocage sur un sémaphore, comme l'a été trouvé par la strace. Une fois que la condition d'erreur se produit, le blocage est répétable, il doit donc y avoir un autre processus qui détient le sémaphore et ne le libère pas.

Y a-t-il un moyen de savoir quel autre processus maintient actuellement le sémaphore?

IPCS répertorie le sémaphore, donc / proc / sysvipc / sem. Où puis-je trouver des informations sur le processus de maintien?


0 commentaires

5 Réponses :


0
votes

Avez-vous essayé xxx


1 commentaires

Ne semble pas fonctionner avec sémaphore. Je peux voir la clé d'accord, mais IPCS -P -S -S ne donne aucune sortie.



5
votes

Les sémaphores ne sont pas des mutiles. Vous ne les "tenez pas". Si le processus est bloqué, cela signifie qu'il attend que quelqu'un d'autre fasse une opération "up" ou "v" sur elle à l'avenir. Il n'y a pas d'outil de noyau qui vous dira quel sera le comportement futur du logiciel.


0 commentaires

3
votes

Il peut y avoir une solution plus facile, mais vous pouvez utiliser l'appel SEMCTL () avec la cmd getpid. Cela devrait renvoyer le processus qui a exécuté le dernier smop () appeler le sémaphore. Cela peut être ou non votre processus de voyous, mais c'est probablement un bon indice.


0 commentaires

2
votes

"IPCS -P" ne peut pas montrer les sémaphores du processus tenant, qui doit être un bogue ou une limite car il est difficile de montrer. Vous devez interroger par votre sitef.

  1. Run "IPCS -S" pour obtenir tout Semide
  2. pour chaque exécution semi-semée "IPCS -S -I"
  3. pour chaque semnum, pour obtenir le propriétaire pid, Si le propriétaire PID est votre souhait, puis montrer le Semide et le Semnum actuel.

    REMARQUE: Si le processus vient de lire des sémaphores, vous ne pouvez pas obtenir de telles informations via la commande IPCS.


0 commentaires

4
votes

Pour trouver les PID associés à la liste des tableaux de sémaphore énumérés par IPCS -S -S code> Vous pouvez exécuter ceci:

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


0 commentaires