捕捉 console/terminal 关闭事件的平台独立方式

Platform independent way to catch console/terminal close event

我的问题很简单:

Is it possible to catch and process console/terminal closing event platform independently?

我的问题与this question, or this, or this不同。 None 这些问题的答案提供了一种独立于平台的方式。那么,有什么办法吗?如果是,那是什么?或者它是不可能的?如果是这样,那是为什么?我的意思是,为什么不能开发一个可以处理这个问题的库?

编辑: 正如@Yakk 所问,我需要它在 Windows 和 Linux 上工作,尽可能减少代码重复。如果有帮助,我正在学习基本的网络。我构建了一个简单的聊天应用程序,我需要在关闭该应用程序的同时在聊天记录文件中添加条目。我已经实现了一种从应用程序内部关闭它的方法。但是,由于用户更有可能点击关闭按钮,我需要能够让该事件执行操作。

没有标准的方法可以做到这一点,我也不知道有可用的库,但自己编写并不难:

#if defined(_WIN32) || defined(WIN32)
static void (*theHandler)(int);
static BOOL WINAPI winHandler(DWORD ctrlType)
{
    theHandler((int)ctrlType);
    return TRUE;
}
#endif

void installConsoleHandler(void (*handler)(int))
{
#if defined(_WIN32) || defined(WIN32)
    theHandler = handler;
    SetConsoleCtrlHandler(&winHandler, TRUE);
#else
    /* sigaction, as you find in your links */
#endif
}

如果您保留此代码,您可以稍后将其扩展到其他平台:

#if windows
#elif linux || compatible
#elif whatever
#else
#error "not implemented for current platform"
#endif

你得到一个真正的图书馆...

上面的代码在 C 和 C++ 中可用(为此我更喜欢 static 而不是匿名命名空间...),因此您可以将它放在 .c 文件中(并将其编译为 C) .为了使其再次在 C++ 中工作(如您所要求的),您需要告诉 C++ 编译器它是一个 C 函数(这意味着没有像 C++ 中那样的名称重整,否则将被应用,因此在链接),因此 header 将包含:

#ifdef __cplusplus
extern "C"
{
#endif
    void installConsoleHandler(void (*handler)(int));
#ifdef __cplusplus
}
#endif

(当然,你没有要求C,但如果你能免费得到它几乎(除了extern "C"的东西),为什么不拿它一起?谁也不知道...)