Kal*_*mar 4 c linux free memory-management sigkill
我在linux中开发了一个包含无限循环的C应用程序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
**/
}
}
Run Code Online (Sandbox Code Playgroud)
如果我按ctrl-c或ctrl-z调用处理程序,但问题出在SIGKILL上.命令kill -9并killall没有启动处理程序.
有人知道为什么吗?是否有建议纠正它?
SIGKILL的全部意义在于无论如何都要杀死这个过程.这就是为什么你不被允许处理它.
在大多数情况下,您从SIGTERM开始,为进程提供良好退出的机会.当SIGTERM不起作用时,SIGKILL通常用作最后的手段.毕竟,SIGTERM的预期行为是进程退出.如果不是,你就知道出了什么问题.
从手册
SIGTERM信号是用于导致程序终止的通用信号.与SIGKILL不同,此信号可以被阻止,处理和忽略.这是礼貌地要求程序终止的正常方式.
...
SIGKILL信号用于立即终止程序.它无法处理或忽略,因此总是致命的.也无法阻止此信号.
在同一文档中,您还可以阅读这个有趣的内容
实际上,如果SIGKILL无法终止进程,那么它本身就构成了您应该报告的操作系统错误.