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、在全局初始化一个临界区,
- windows和linux下设置控制台CTRL+C等特殊按键的回调函数之后程序结束的过程
- 设置控制台关闭的回调函数
- SWT中特殊按键CTRL+X等的判断
- linux下如何在shell中结束进程(ctrl+c\ctrl+z\ctrl+d\ctrl+\的用法)
- WINDOWS console程序截获CTRL+C按键
- windows 控制台程序 响应 Ctrl+C
- windows 控制台程序 响应 Ctrl+C
- Linux下C/C++程序处理Ctrl+C的例子
- Linux下C/C++程序处理Ctrl+C的例子
- linux下的Ctrl+c
- Linux下ctrl+c,ctrl+d,ctrl+z的含义
- Linux下ctrl+c,ctrl+z,ctrl+d的区别
- Linux下Ctrl+D、Ctrl+C和Ctrl+Z的联系及区别
- 控制台程序输入CTRL+C后弹出异常的原因
- 控制台设置回调函数,SetConsoleCtrlHandler
- Windows控制台应用程序中处理Ctrl+C等
- ctrl+c,ctrl+d,ctrl+z在linux程序中意义和区别 ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样. ctrl+c是强制中断程序的执行,,进程已经终止。 ct
- Linux操作系统下运行命令时Ctrl+C和Ctrl+Z的作用及恢复
- 各种自带函数
- 重写与重载
- Android init.c简析
- 【Java工程师之路】[3-2.3]JavaScript
- Excel 人民币大写函数(亲自实践)
- windows和linux下设置控制台CTRL+C等特殊按键的回调函数之后程序结束的过程
- Integer.valueOf(String s)与Integer.parseInt(String s)区别
- Tomcat:Caused by: java.lang.OutOfMemoryError: PermGen space解决方案
- C++函数与程序结构
- 抓取HTML中的图片资源
- 清除XCode缓存和生成文件
- 硬盘安装Win7
- Selenium私房菜系列4 -- Selenium IDE的使用
- 用Win6Ins安装win7就是这么简单!