windows和linux下设置控制台CTRL+C等特殊按键的回调函数之后程序结束的过程

来源:互联网 发布:南京行知基地学农宿舍 编辑:程序博客网 时间:2024/05/17 09:35

前提:控制台(Console)

1、window下

想要截获CTRL+C等特殊按键,需要通过SetConsoleCtrlHandler添加一个回调函数,具体使用详见MSDN。重要的是,设置了回调函数后,当你按照CTRL+C特殊按键时,另一个线程会先调用你设置的回调函数,然后再直接结束整个进程,这种结束是非正常的。调用你回调函数的线程是系统的,相当异步调用,所以你不能在你的回调函数中直接释放资源。

这样就有一个问题,如果程序非正常结束,那么很多资源就可能没有释放造成内存泄漏等。目前我们的游戏服务器中也遇到了这个问题,我的做法是:

1、在全局初始化一个临界区cs_。

2、进入main后首先通过SetConsoleCtrlHandler添加一个特殊按键的回调函数。然后进入临界区cs_。然后初始化服务器开始主循环等。main函数退出之前要退回临界区。这个可以通过ScopedLock来实现。

3、在回调函数中,设置服务器主循环的继续的标志为false,以让服务器正常的退出。然后等待进入临界区cs_。等待进入临界区cs_实质上就是等待服务器所在的主线程退出。因为如果不等待的话,回调函数返回后整个程序进程都会被直接结束。


2、linux下

linux下想要截获CTRL+C等特殊按键可以通过sigaction和signal来注册你感兴趣的信号(有些信号你不能注册回调函数)。

与windows最大的不同的是,你注册的回调函数返回后整个程序不会直接结束,所以你回调函数中就可以只是设置一个退出标志位,而不用等待主线程。


2、在全局初始化一个临界区,
原创粉丝点击