我的问题只是:
是否可以独立捕获和处理控制台/终端关闭事件平台?
我的问题与this question,this或this不同。这些问题的答案都没有提供独立于平台的方式。那么,有什么办法吗?如果是,那么它是什么?或者这是不可能的?如果是这样,为什么呢?我的意思是,为什么不可能开发一个可以处理这个问题的库?
编辑:正如@Yakk所问,我需要它可以在Windows和Linux上运行,代码重复次数最少。如果有帮助,我会学习基本的网络。我构建了一个简单的聊天应用,我需要在关闭应用时在聊天记录文件中添加条目。我已经实现了一种从应用内部关闭它的方法。但是,由于用户更有可能点击关闭按钮,我需要能够通过该事件来执行操作。
答案 0 :(得分:1)
没有标准的方法可以这样做,而且我不知道有可用的库,但是自己编写它并不困难:
#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 ++中那样的名称修改,否则将被应用,因此在期间找不到该函数链接),所以标题将包含:
#ifdef __cplusplus
extern "C"
{
#endif
void installConsoleHandler(void (*handler)(int));
#ifdef __cplusplus
}
#endif
(当然,你没有要求C,但如果你可以免费获得它几乎(除了extern "C"
的东西),为什么不把它带走?一个人永远都不知道...)