Я разработал приложение C в Linux, которое содержит бесконечный цикл while(1)
. Есть некоторые указатели, которые распределяются динамически и полезны в бесконечном цикле, поэтому единственный раз, когда можно освободить память, это после прерывания while(1)
на ctrl-z
, ctrl-c
, kill -9 apppid
, killall appname
. Итак, идея состоит в том, что я связываю новый обработчик, который освобождает память с сигналами событий прерывания.
void deallocatehandler(int signal){ printf("Memory Deallocation\n"); exit(0);}
int main(){
signal(SIGINT, &deallocatehandler);
signal(SIGTSTP, &deallocatehandler);
signal(SIGKILL, &deallocatehandler);
while(1){
/**
Some code here
**/
}
}
Если я нажимаю ctrl-c или ctrl-z, вызывается обработчик, но проблема связана с SIGKILL. Команды kill -9
и killall
не запускают обработчик.
Кто-нибудь знает, почему? и есть предложения по исправлению?
malloc()
,free()
и дажеprintf()
, не безопасны для асинхронных сигналов и не должны вызываться из обработчика сигналов. - person Andrew Henle   schedule 24.10.2017