linux上的c ++应用程序,在kill之前挂钩

时间:2016-04-05 20:06:11

标签: c++ c linux kill kill-process

我多次遇到Linux上的Linux Out of Memory Killer监视程序正在查杀我的应用程序,这很难调试和识别......

在Linux下运行的c / c ++应用程序中是否存在在应用程序被杀之前打印消息?

1 个答案:

答案 0 :(得分:2)

如果我是对的,OOM会向您的进程发送SIGTERM信号,因此您可以根据需要处理它。

我不对,很可能OOM会发给你SIGKILL,你什么也做不了。但在某些情况下,您将获得SIGTERM。

(未经测试的草案)

#include <csignal>
void signal_handler(int signal) {
    // Your handling code here
}

int main() {
    // Install handler (assign handler to signal)
    std::signal(SIGINT, signal_handler);
}

C对应方:

#include<signal.h>
#include<unistd.h>

void signal_handler(int signo)
{
  if (signo == SIGTERM) {
    // your handling code
  }        
}

int main(void)
{
  if (signal(SIGTERM, signal_handler) == SIG_ERR) {
    printf("\nError installing handler\n");
  }
  // Rest of your application
}

处理信号时要小心,因为您要覆盖默认行为。您的程序不应忽略SIGTERM或SIGINT等重要信号:处理函数必须完成程序的完成或者调用原始处理程序。

另一方面,您可以使用它:如果您确定问题是分配的内存,您可以尝试释放未使用的空间并尝试继续工作(但您需要确保信号原因是这样)。