Wie bekomme ich Prozesse, die aktuell Semaphoren von / proc ausführen?

16

Ich frage mich, wie Prozesse, auf denen derzeit Semaphoren ausgeführt werden, abgerufen werden können /proc. Ich vermute, es ist durch SysVIPC-Unterverzeichnis möglich. Aber ich weiß nicht, wie man diese Befehle verwendet.

Ubuntu 12.10

Hanna
quelle
1
In /proc/PID/mapskönnen Sie die Speicherzuordnung eines Prozesses sehen und POSIX-Semaphore werden als angehängte Dateien in angezeigt /dev/shm. Bei SysV-Semaphoren bin ich mir allerdings nicht sicher.
Lgeorget
@lgeorget und ich haben bestätigt, dass sowohl POSIX- als auch SysV-Semaphore /proc/PID/mapsfür eine bestimmte PID tatsächlich in der Datei angezeigt werden .
slm
Aber anscheinend werden Fragmente des gemeinsamen Speichers auch als Einträge in angezeigt /dev/shmund sind von Semaphoren kaum zu unterscheiden (außer wenn sie clevere Namen haben).
12.

Antworten:

21

Meine einzige Erfahrung im Umgang mit Semaphoren und Shared Memory ist die Verwendung des Befehls ipcs. Weitere Informationen finden Sie auf der ipcs-Manpage .

Dieser Befehl zeigt Ihnen, welche Prozesse Semaphoren haben:

$ ipcs -s

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

Mit dem bekannten Semid können wir zusätzliche Informationen zu den PIDs mit Semaphoren abfragen (beachten Sie, dass es 8 - die Spalte nsems - gibt):

$ 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 

Die PID-Spalte sind diese Prozesse. Sie können sie entweder mit psoder über das /procDateisystem suchen /proc/<pid>.

Beispielsweise:

$ more /proc/2265/cmdline 
mono

POSIX & SystemV

Aufbauend auf einem Kommentar von @lgeorget habe ich mich mit dem /proc/2265/mapInhalt meiner PID 2265 befasst und die folgenden /dev/shmReferenzen gefunden:

$ 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
quelle
Soweit ich weiß, werden nur System V-Semaphoren (die, mit denen Sie arbeiten semget(2)) angezeigt. ipcs -sWenn Sie POSIX-Semaphoren (die, mit denen Sie arbeiten sem_open(2)) verwenden, müssen Sie eine andere Methode verwenden.
Lgeorget
Kennen Sie Terminalbefehle, die die Sorte sem_open (2) zurückgeben? Nur neugierig. Alles, was ich über Semaphoren weiß, steht in der Antwort über 8-).
slm
Nein, das ist das Problem. ;) Wie die ipcsManpage sagt: "Das Linux-Dienstprogramm ipcs ist nicht vollständig kompatibel mit dem POSIX-Dienstprogramm ipcs." Daher bin ich mir nicht sicher, ob sie überhaupt an etwas für POSIX IPC gedacht haben. Vielleicht eine zukünftige Veröffentlichung von ipcs:).
Lgeorget
der inhalt der mapbeiden sorten von semaphoren ist gedacht, richtig?
slm
Ich denke schon. So oder so müssen Semaphoren irgendwo im Prozessspeicher angehängt werden. Ich war mir jedoch nicht sicher, ob SysV-Semaphoren auch im Pseudodateisystem erstellt wurden /dev/shm. Jetzt haben wir die Antwort. :)
lgeorget