linux 上的 c++ 应用程序,在 kill 之前挂机
c++ application on linux, on hook before kill
我多次遇到 Linux 上的 Linux Out of Memory Killer 看门狗正在杀死我的应用程序,这很难调试和识别...
在 Linux 下的 c/c++ 应用程序 运行 中是否有在应用程序被终止之前打印消息的方法?
如果我是对的,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 等重要信号:处理函数必须执行完成程序或调用原始处理程序的工作。
另一方面,你可以尝试一下:如果你确定问题出在分配的内存上,你可以尝试释放未使用的 space 并尝试继续工作(但你需要确保信号原因是那个)。
我多次遇到 Linux 上的 Linux Out of Memory Killer 看门狗正在杀死我的应用程序,这很难调试和识别...
在 Linux 下的 c/c++ 应用程序 运行 中是否有在应用程序被终止之前打印消息的方法?
如果我是对的,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 等重要信号:处理函数必须执行完成程序或调用原始处理程序的工作。
另一方面,你可以尝试一下:如果你确定问题出在分配的内存上,你可以尝试释放未使用的 space 并尝试继续工作(但你需要确保信号原因是那个)。