C ++ приложение на Linux, на крючок, прежде чем убить

Я неоднократно сталкивался с тем, что сторожевой таймер Linux Out of Memory Killer в Linux убивает мое приложение, это трудно отладить и определить …

Есть ли в приложении c / c ++, работающем под Linux, возможность напечатать сообщение до того, как приложение будет убито?

0

Решение

Если я прав, 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);
}

С аналогом:

#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: функция обработки должна выполнить работу по завершению программы или, возможно, вызвать оригинальный обработчик.

С другой стороны, вы можете поиграть с ним: если вы уверены, что проблема заключается в выделенной памяти, вы можете попытаться освободить неиспользуемое пространство и попытаться продолжить работу (но вы должны убедиться, что причина сигнала именно такова).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]