2010-07-29 18 views
7

Estoy trabajando en un programa que usa memoria compartida. Varias instancias de dicho programa se conectarán a una existente o la crearán de nuevo, y la devolverán al sistema operativo cuando no haya otros procesos o simplemente se desconectarán y terminarán. Pensé en usar un contador simple para realizar un seguimiento de cuántos procesos lo usan.¿Cómo hacer una limpieza después de SIGKILL?

Estoy usando la función atexit() para hacer la limpieza, sin embargo, afaik, al recibir la señal SIGKILL, los procesos no harán ninguna limpieza, por lo que si alguno de esos procesos no termina normalmente, es posible que nunca pueda limpia la memoria

¿Hay alguna manera de especificar qué hacer incluso después de una señal SIGKILL? Probablemente voy a escribir algún mecanismo similar a un temporizador para verificar si los procesos todavía están vivos, pero realmente me gustaría evitarlo si hay otra forma.

Respuesta

16

No, SIGKILL no puede ser atrapado de ninguna manera por su aplicación; si pudiera, la aplicación podría ignorarlo, lo que vencería su propósito.

13

No se puede detectar SIGKILL.

Sin embargo, usted puede aún hacer la limpieza, siempre que la limpieza se realice por otro proceso. Hay muchas estrategias con las que puede trabajar para que su proceso de administración vea que sus otros procesos aparecen y desaparecen.

Por ejemplo: puede tener un socket de dominio Unix en una ubicación conocida, que el ama de llaves escucha; cada proceso esclavo abre el socket para indicar que está usando el segmento de memoria compartida. Cuando sale un esclavo, por la razón que sea, el zócalo se cerrará. El ama de llaves puede ver que esto suceda y puede hacer la limpieza.

+0

+1 para explicar un concepto – Robert

4

Combinado con memoria compartida, robustos mutexes ubicados en el segmento de memoria compartida sería una gran herramienta. Si un proceso muere mientras se mantiene un bloqueo en un mutex robusto, el siguiente proceso para intentar bloquearlo obtendrá EOWNERDEAD y podrá realizar la limpieza que el propietario original debería haber realizado.

Cuestiones relacionadas