Como obter processos atualmente executando semáforos por / proc?

16

Gostaria de saber como obter processos atualmente executando semáforos por /proc? Eu acho que é possível pelo subdiretório SysVIPC. Mas eu não sei como usar esses comandos.

Ubuntu 12.10

Hanna
fonte
1
Em /proc/PID/maps, você pode ver o mapeamento de memória de um processo e os semáforos POSIX aparecem como arquivos anexados /dev/shm. Não tenho certeza sobre os semáforos SysV embora.
Lgeorget
O @lgeorget e eu confirmamos que os semáforos POSIX e SysV aparecem de fato no /proc/PID/mapsarquivo para um determinado PID.
slm
Mas, aparentemente, os fragmentos de memória compartilhada também aparecem como entradas /dev/shme são bastante indistinguíveis dos semáforos (exceto se tiverem nomes inteligentes).
Lgeorget 12/05

Respostas:

21

Minha única experiência em lidar com semáforos e memória compartilhada é através do uso do comando ipcs. Dê uma olhada na página de manual do ipcs para obter mais detalhes.

Este comando mostra quais processos têm semáforos:

$ ipcs -s

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

Com o semid conhecido, podemos consultar informações adicionais sobre os PIDs que possuem semáforos (observe que há 8 - a coluna 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 

A coluna pid são esses processos. Você pode procurá-los usando psou procurar no /procsistema de arquivos /proc/<pid>.

Por exemplo:

$ more /proc/2265/cmdline 
mono

POSIX e SystemV

Com base em um comentário deixado por @lgeorget, procurei no /proc/2265/mapconteúdo do meu PID 2265 e encontrei as seguintes /dev/shmreferências:

$ 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
fonte
Até onde eu sei, apenas os semáforos do System V (aqueles com os quais você se relaciona semget(2)) são exibidos; ipcs -sportanto, se você estiver usando os semáforos POSIX (aqueles com quem se relaciona sem_open(2)), precisará usar outro método.
Lgeorget
Conhece algum comando do terminal que retornará a variedade sem_open (2)? Apenas curioso. Tudo o que sei sobre semáforos está na resposta acima 8-).
slm
Não, esse é o problema. ;) Como a página de ipcsmanual diz: "O utilitário Linux ipcs não é totalmente compatível com o utilitário POSIX ipcs." então não tenho certeza de que eles tenham pensado em algo para o POSIX IPC. Talvez uma versão futura de ipcs:).
Lgeorget
o conteúdo do mapsão ambas as variedades de semáforos pensadas, correto?
slm
Eu acho. De uma forma ou de outra, os semáforos precisam ser anexados em algum lugar da memória do processo. Mas não tinha certeza de que os semáforos SysV também foram criados no pseudo-sistema de arquivos /dev/shm. Agora, temos a resposta. :)
lgeorget