#include "Core/Base/global_include.h" #include "Core/spdlog/export.h" #include "Core/system/export.h" #include "export.h" #include #include namespace Psc { // std::exit std::terminate 的核心区别就是 是否需要生成core_dump 文件 // std::terminate() 到底做了什么(标准层面) // 默认行为:调用 std::abort() // abort() → 发送 SIGABRT // 在 Linux/systemd 下: // SIGABRT 通常生成 core // 前提: // ulimit -c ≠ 0 // LimitCORE 允许 // 未被 coredump 规则拦截 // 典型触发场景: // 未捕获异常 // noexcept 函数抛异常 // 明确选择 Fail-Fast // terminate 的职责: // 定义 “此时必须终止” 的 语言语义 // 调用 terminate handler // 允许用户替换策略(std::set_terminate) // std::set_terminate([]{ // log_fatal(); // std::abort(); // }); // std::exit() 到底做了什么(标准层面) // C++ 标准规定,std::exit() 会: // 调用 所有 std::atexit() 注册的函数(逆序) // 刷新并关闭标准 I/O // 结束进程 // TODO: 未被管理的线程的 线程安全问题 std::atomic_int stop_program = 0; std::function g_fail_fast = [](std::string msg) { std::cout << get_current_time_as_string() << " 默认快速失败触发!(不生成core_dump_文件) " << VAR_STR_1(msg) << " 系统错误码:" << get_error_message() << std::endl; std::cout << LOG_POS << std::endl; std::exit(75); }; void fail_fast(std::string msg) { g_fail_fast(std::move(msg)); } void set_fail_fast(std::function ff) { std::cout << "set_fail_fast 覆盖默认主动失败处理函数" << std::endl; g_fail_fast = std::move(ff); } void fail_fast_core_dump(std::string msg) { std::cout << get_current_time_as_string() << " 默认快速失败触发!(生成core_dump_文件) " << VAR_STR_1(msg) << " 系统错误码:" << get_error_message() << std::endl; std::cout << LOG_POS << std::endl; std::terminate(); } }