2010-07-29 15 views
7

Sto lavorando a un programma che utilizza la memoria condivisa. Più istanze di tale programma si collegheranno a una esistente o la creeranno di nuovo e la restituiranno al sistema operativo quando non ci sono altri processi o semplicemente la scollegano e terminano. Ho pensato di usare un semplice contatore per tenere traccia di quanti processi lo usano.Come eseguire una pulizia dopo SIGKILL?

Sto utilizzando la funzione atexit() per eseguire la pulizia, tuttavia, dopo aver ricevuto il segnale SIGKILL, i processi non eseguono alcuna operazione di pulizia, quindi se uno di questi processi non termina normalmente, potrei non essere mai in grado di pulisci la memoria.

C'è un modo per specificare cosa fare anche dopo un segnale SIGKILL? Probabilmente scriverò un meccanismo simile a un timer per verificare se i processi sono ancora vivi, ma mi piacerebbe davvero evitarlo se c'è un altro modo.

risposta

16

No, SIGKILL non può essere catturato in alcun modo dall'applicazione - se potesse, l'applicazione potrebbe ignorarlo, il che potrebbe vanificare il suo scopo.

13

Non è possibile prendere SIGKILL.

Tuttavia: è possibile eseguire purché la pulizia venga eseguita da un altro processo. Ci sono molte strategie che puoi seguire qui per permettere al tuo processo di pulizia di vedere gli altri processi apparire e scomparire.

Ad esempio: si potrebbe avere un socket di dominio Unix in una posizione nota, che la governante ascolta; ogni processo slave apre il socket per indicare che sta usando il segmento di memoria condivisa. Quando uno schiavo esce, per qualsiasi motivo, la presa si chiuderà. La governante può vedere questo accadere e può fare la pulizia.

+0

+1 per spiegare un concetto – Robert

4

Combinato con memoria condivisa, robusto mutex situato nel segmento di memoria condivisa sarebbe un ottimo strumento. Se un processo muore mentre si tiene un blocco su un mutex robusto, il processo successivo per tentare di bloccarlo otterrà EOWNERDEAD e può eseguire la pulizia che il proprietario originale avrebbe dovuto eseguire.