[C con Clase] Cerrar IPC's al capturar señal

Facundo Curti facu.curti en gmail.com
Vie Ago 22 03:33:57 CEST 2014


El 21 de agosto de 2014, 21:49, d1cor <cordobadie en gmail.com> escribió:
>
>
>
>
> On Wed, 20 Aug 2014 01:25:16 -0300
> Facundo Curti <facu.curti en gmail.com> wrote:
>
> > Holas. Como están? Programo para linux, estoy intentando capturar la señal
> > sigint con la funcion signal, para que antes de cerrarse libere todos los
> > recursos compartidos (un shared memory y un semaforo). No se me ocurre como
> > hacerlo.
> >
> > El problema está en que a la funcion signal solo le puedo pasar el puntero
> > a una funcion "int funcion (int)". Así que por medio de parametros, no
> > tengo forma de indicarle a la funcion de cierre el ID de la memoria
> > compartida y del semaforo. Quiero evitar hacer globales estas variables.
> >
> > ¿Alguna idea de como puedo hacerlo?
>
> Hola Facundo!
>
> En realidad, la terminación abrupta de procesos (SIGKILL) es la que no libera recursos normalmente y obliga al proceso a terminar su ejecución.
>
> SIGINT y SIGTERM son señales de terminación normales, por lo que deberían estar liberando los recursos propios y privados del proceso.
>
> Ahora, los recursos compartidos de IPC (shm, sem, ...) son independientes del proceso que los crea, y son recursos administrados por el sistema operativo.
>
> A simple vista, se me ocurre capturar el valor de retorno del proceso en cuestión, una vez que terminó, y en consecuencia hacer algo con los recursos compartidos desde el propio SO.
> Otra sería lanzar el proceso que usa los recursos como fork de otro proceso (padre), y que el padre libere los recursos compartidos por el proceso terminado una vez que espera su terminación.
>
> De todos modos tené cuidado, porque se supone que el proceso que va a liberar los recursos compartidos está compartiendo datos por medio de esos mecanismos de IPC con otros procesos, y si al terminar eliminás todas las estructuras, el resto de los procesos pueden perder información... da para pensarlo un poco más.

Si, es que enrealidad se trata de un demonio corriendo de fondo. Y por
medio de un cliente puedo consultar datos a ese demonio. Entonces, el
cliente se ejecuta una sola vez, muestra los valores (Almacenados en
el recurso compartido), y se cierra. La cuestion seria que cuando
alguien envie una señal de terminacion al demonio, se liberen los
recursos compartidos.
>

Me parece genial la idea de forkear el proceso, creo que haré eso.
Gracias! ;)




Más información sobre la lista de distribución Cconclase