Я неоднократно сталкивался с тем, что сторожевой таймер Linux Out of Memory Killer в Linux убивает мое приложение, это трудно отладить и определить …
Есть ли в приложении c / c ++, работающем под Linux, возможность напечатать сообщение до того, как приложение будет убито?
Если я прав, 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: функция обработки должна выполнить работу по завершению программы или, возможно, вызвать оригинальный обработчик.
С другой стороны, вы можете поиграть с ним: если вы уверены, что проблема заключается в выделенной памяти, вы можете попытаться освободить неиспользуемое пространство и попытаться продолжить работу (но вы должны убедиться, что причина сигнала именно такова).
Других решений пока нет …