c/linux无限循环应用程序:如果调用kill -9命令,则释放内存

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 -9killall没有启动处理程序.

有人知道为什么吗?是否有建议纠正它?

klu*_*utt 5

SIGKILL的全部意义在于无论如何都要杀死这个过程.这就是为什么你不被允许处理它.

在大多数情况下,您从SIGTERM开始,为进程提供良好退出的机会.当SIGTERM不起作用时,SIGKILL通常用作最后的手段.毕竟,SIGTERM的预期行为是进程退出.如果不是,你就知道出了什么问题.

手册

SIGTERM信号是用于导致程序终止的通用信号.与SIGKILL不同,此信号可以被阻止,处理和忽略.这是礼貌地要求程序终止的正常方式.

...

SIGKILL信号用于立即终止程序.它无法处理或忽略,因此总是致命的.也无法阻止此信号.

在同一文档中,您还可以阅读这个有趣的内容

实际上,如果SIGKILL无法终止进程,那么它本身就构成了您应该报告的操作系统错误.