Comment obtenir des processus exécutant actuellement des sémaphores par / proc?

16

Je me demande comment obtenir des processus exécutant actuellement des sémaphores /proc? Je suppose que c'est possible par le sous-répertoire SysVIPC, mais je ne sais pas comment utiliser ces commandes.

Ubuntu 12.10

Hanna
la source
1
Dans /proc/PID/maps, vous pouvez voir le mappage de la mémoire d'un processus et les sémaphores POSIX s'affichent sous forme de fichiers joints dans /dev/shm. Je ne suis pas sûr des sémaphores SysV.
lgeorget
@lgeorget et moi-même avons confirmé que les sémaphores POSIX et SysV apparaissent en fait dans le /proc/PID/mapsfichier pour un PID donné.
slm
Mais apparemment, les fragments de mémoire partagée apparaissent également comme des entrées dans /dev/shmet ils sont assez indiscernables des sémaphores (sauf s'ils ont des noms intelligents).
lgeorget

Réponses:

21

Ma seule expérience dans le traitement des sémaphores et de la mémoire partagée consiste à utiliser la commande ipcs. Jetez un œil à la page de manuel ipcs pour plus de détails.

Cette commande vous montre quels processus ont des sémaphores:

$ ipcs -s

------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x4d114854 65536      saml       600        8         

Avec le semid connu, nous pouvons demander des informations supplémentaires sur les PID qui ont des sémaphores (notez qu'il y en a 8 - la colonne nsems):

$ ipcs -s -i 65536

Semaphore Array semid=65536
uid=500  gid=501     cuid=500    cgid=501
mode=0600, access_perms=0600
nsems = 8
otime = Sun May 12 14:44:53 2013  
ctime = Wed May  8 22:12:15 2013  
semnum     value      ncount     zcount     pid       
0          1          0          0          0         
1          1          0          0          0         
2          1          0          0          2265      
3          1          0          0          2265      
4          1          0          0          0         
5          1          0          0          0         
6          1          0          0          4390      
7          1          0          0          4390 

La colonne pid sont ces processus. Vous pouvez les rechercher à l' aide psou regarder à travers le /procsystème de fichiers, /proc/<pid>.

Par exemple:

$ more /proc/2265/cmdline 
mono

POSIX et SystemV

À partir d'un commentaire laissé par @lgeorget, j'ai fouillé dans le /proc/2265/mapcontenu de mon PID 2265 et j'ai trouvé les /dev/shmréférences suivantes :

$ grep shm /proc/2265/maps 
7fa38e7f6000-7fa38ebdf000 rw-s 00000000 00:11 18517                      /dev/shm/mono-shared-500-shared_fileshare-grinchy-Linux-x86_64-40-12-0
7fa38f0ca000-7fa38f0cb000 rw-s 00000000 00:11 18137                      /dev/shm/mono.2265
7fa3967be000-7fa3967d3000 rw-s 00000000 00:11 18516                      /dev/shm/mono-shared-500-shared_data-grinchy-Linux-x86_64-328-12-0
slm
la source
Pour autant que je sache, seuls les sémaphores System V (ceux que vous obtenez semget(2)) apparaissent, ipcs -sdonc si vous utilisez des sémaphores POSIX (ceux que vous obtenez sem_open(2)), vous devez utiliser une autre méthode.
lgeorget
Connaissez-vous des commandes de terminal qui renverront la variété sem_open (2)? Juste curieux. Tout ce que je sais sur les sémaphores se trouve dans la réponse ci-dessus 8-).
slm
Non, c'est ça le problème. ;) Comme le ipcsdit la page de manuel: "L'utilitaire Linux ipcs n'est pas entièrement compatible avec l'utilitaire POSIX ipcs." donc je ne suis pas sûr qu'ils aient même pensé à quelque chose pour POSIX IPC. Peut-être une future version de ipcs:).
lgeorget
le contenu de la mapsont les deux variétés de sémaphores pensé, correct?
slm
Je suppose. D'une manière ou d'une autre, les sémaphores doivent être attachés quelque part dans la mémoire du processus. Mais je n'étais pas sûr que les sémaphores SysV aient également été créés dans le pseudo-système de fichiers /dev/shm. Maintenant, nous avons la réponse. :)
lgeorget