【问题标题】:c++ application on linux, on hook before killlinux上的c ++应用程序,在杀死之前挂机
【发布时间】:2016-07-25 23:08:20
【问题描述】:

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

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

【问题讨论】:

  • 不是真的,但你可以附加一个调试器...sudo gdb -ex run --args ./program arg1 arg2 ...
  • 它是如何被杀死的?立即 SIGKILL?恐怕你无能为力,而不是修改你的应用程序以不占用那么多内存。
  • 任何此类功能都会破坏 OOM 杀手的目的 - 这将是避免其行动的一种方式。

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


【解决方案1】:

如果我是对的,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:处理函数必须完成程序的完成工作,或者可能调用原始处理程序。

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

【讨论】:

  • IIRC,OOM 发送 SIGKILL,你死了。
  • @MartinJames 根据linuxdevcenter.com/pub/a/linux/2006/11/30/… 是SIGTERM。
  • @user58697 嗯。我们在可用文档中存在差异:(
  • authoritative source 说是SIGKILL
  • @MartinJames 现在我刷新它,你是对的。但是,我记得在强制终止之前获得了 SIGTERM,可能是编译器处理程序或其他系统观察者(我还在回答之前找到了来自 linuxdevcenter 的链接)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多