No creo que pueda hacer esto con las herramientas estándar. Puede usar ipcs -mp
para obtener el proceso de identificación del último proceso para adjuntar/separar pero no conozco cómo obtener todos los procesos adjuntos con ipcs
.
con un segmento de los dos procesos inscritos, suponiendo que ambos quedaron unidos, posiblemente puede averiguar el creador de PID cpid
y última adjunta PID lpid
que son los dos procesos, pero eso no va a escalar a más de dos procesos por lo que su utilidad es limitada.
El método cat /proc/sysvipc/shm
parece igualmente limitado, pero creo que hay una manera de hacerlo con otras partes del /proc
sistema de archivos, como se muestra a continuación:
Cuando hago un grep
en los procfs
mapas para todos los procesos, consigo entradas que contienen líneas para los procesos cpid
y lpid
.
Por ejemplo, consigo el segmento de memoria compartida siguiente de ipcs -m
:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 123456 pax 600 1024 2 dest
y, desde ipcs -mp
, la cpid
es 3956 y la lpid
es 9,999 para ese segmento de memoria compartida dada (123456).
Luego, con el comando grep 123456 /proc/*/maps
, veo:
/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted)
/proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)
Así que no es una manera de conseguir que los procesos para su concesión. Estoy bastante seguro de que el estado dest
y el indicador (deleted)
se deben a que el creador ha marcado el segmento para su destrucción una vez que se produce el desprendimiento final, no es que ya haya sido destruido.
Por lo tanto, al escanear los /proc/*/maps
"archivos", debe poder descubrir qué PID están actualmente conectados a un segmento determinado.
Unix semántica permite eliminar te archivos/objetos que todavía están en uso. Eso significa que puede eliminar archivos que aún están abiertos. Entonces, el nombre del archivo se borra pero el objeto del archivo aún está allí, una vez que se cierra el último identificador de archivo, ya no hay más referencia al archivo y se elimina. Lo mismo ocurre con los objetos de memoria compartida en estado "(eliminado)". Esos todavía están allí pero ya no son accesibles desde nuevos procesos. – hurikhan77