SetConsoleCtrlHandler() -- 设置控制台信号处理函数
http://www.groad.net/bbs/thread-8253-1-1.html
当你在命令行里工作时,经常会输入 Ctrl-C 这个组合键以停止程序的运行。SetConsoleCtrlHandler() 函数可以让一个或多个特定函数在接收到 Ctrl-C, Ctrl-break 这些与控制台有关的信号时得到执行。
- BOOL WINAPI SetConsoleCtrlHandler(
- _In_opt_ PHANDLER_ROUTINE HandlerRoutine,
- _In_ BOOL Add
- );
复制代码
函数有两个参数,第 1 个参数是要安装的信号处理函数,当第 2 个参数 Add 设置为 TRUE 时,那么就安装第 1 个参数所表示的处理函数;否则,就从控制台控制例程列表中将之删除。需要注意的是,这里没有指定信号,测试到底是什么信号,是处理程序所负责的事情。
函数的返回值是个布尔值,当函数执行成功时,返回非 0 值;反之,返回 0 值,具体的出错原因,可以用 GetLastError() 函数来获得。
如果第 1 个参数设置为 NULL,且 Add 为 TRUE 时,那么 Ctrl-C 信号会被忽略。
如果已经使用 SetConsoleMode() 设置了 ENABLE_PROCESSED_INPUT 标志,那么系统会将 Ctrl-C 作为键盘输入处理,而不是作为信号处理。
处理程序例程实际上是以进程内的独立线程执行的,正常的程序将继续操作。
处理程序:
- BOOL WINAPI HandlerRoutine(
- _In_ DWORD dwCtrlType
- );
复制代码
带有一个 DWORD 类型值 dwCtrlType ,它用来标识信号(或事件),可以是以下 5 个值之一:
1) CTRL_C_EVENT 表示键盘输入了 Ctrl-C 。
2) CTRL_CLOSE_EVENT 表示控制台窗口正在被关闭。
3) CTRL_BREAK_EVENT 表示 Ctrl_break 信号。
4) CTRL_LOGOFF_EVENT 表示用户正在注销。
5) CTRL_SHUTDOWN_EVENT 表示 Windows 正在关闭。
信号处理程序可以像异常或终止程序那样执行清理操作。当信号处理程序返回 TRUE 时,表示函数已经处理了信号;若是返回 FALSE ,那么就去执行列表中下一个处理程序函数。信号处理程序与设置顺序相反的顺序执行,也就是说,最后一个设置程序将被首先执行,而系统的处理程序在最后执行。
SetConsoleCtrlHandler() -- 设置控制台信号处理函数的更多相关文章
- SetConsoleTextAttribute 函数--设置控制台文本属性
SetConsoleTextAttribute函数 来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs. ...
- Linux 多线程应用中如何编写安全的信号处理函数
http://blog.163.com/he_junwei/blog/static/1979376462014021105242552/ http://www.ibm.com/developerwor ...
- 在信号处理函数中调用longjmp
错误情况及原因分析 前两天看APUE的时候,有个程序要自己制作一个sleep程序,结果在这个程序中就出现了在信号处理函数中调用longjmp函数的情况,结果就出现了错误,具体错误是啥呢,请参见下面这段 ...
- SetConsoleCtrlHandler 处理控制台消息
转载自csdn:http://blog.csdn.net/zhongguoren666/article/details/8770615 SetConsoleCtrlHandler 处理控制台消息 ...
- 控制台API函数----HANDLE、SetConsoleCursorPosition、SetConsoleTextAttribute
控制台API函数 调用相关文本界面控制的API函数,这些函数可分为三类. 一.用于控制台窗口控制的函数(包括窗口的缓冲区大小.窗口前景字符和背景颜色.窗口标题.大小和位置等): 二.用于控制台输入输出 ...
- 信号处理函数的返回sigsetjmp/siglongjmp
由于在信号处理期间自动屏蔽了正在被处理的信号,而使用setjmp/longjmp跳出信号处理程序时又不会自动将 信号屏蔽码修改会原来的屏蔽码,从而引起该信号被永久屏蔽. 可以使用sigsetjmp/s ...
- 信号处理函数的返回setjmp/longjmp
信号处理函数可以正常返回,也可以调用其他函数返回到程序的主函数中,而不是从该处理程序返回. 正如ANSI C标准所说明的,一个信号处理程序可以返回或者调用abort.exit或longjmp(goto ...
- Linux 多线程应用中如何编写安全的信号处理函数【转】
转自:https://www.cnblogs.com/virusolf/p/4945642.html http://blog.163.com/he_junwei/blog/static/1979376 ...
- Linux信号、信号处理和信号处理函数
信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可 ...
随机推荐
- ACPI in Linux
https://01.org/zh/linux-acpi The goal of this project is to enable Linux to take advantage of platfo ...
- Kubernetes对象之Service
系列目录 通过ReplicaSet来创建一组Pod来提供具有高可用性的服务.虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题: Pod IP仅仅是集群内可见的虚拟IP,外部无法访问. ...
- Tika解析word文件
Apache POI - HWPF and XWPF - Java API to Handle Microsoft Word Files http://poi.apache.org/document/ ...
- MYSQL 5.6修改密码
忘记了超级用户root密码的时候怎么办呢? 1. 修改配置文件跳过密码 (1)编辑mysql主配置文件my.cnf # vim /etc/my.cnf 在[mysqld] 字段下添加参数 skip-g ...
- Oracle中Hint深入理解
Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行 ...
- vi 之行号操作---显示行号、跳到指定行
1.设置行号显示 esc ->:->set nu 2.跳到指定行 esc-> 123gg 3. 进入命令模式 ?一:在冒号下输入 vim vi 在命令模式中 使用 d(版本不同 使用 ...
- ffmpeg强制使用TCP方式推流到EasyDarwin开源流媒体服务器进行直播
我们的EasyDarwin目前部署在阿里云的服务器上面,运行的效果是非常好的,而且无论是以TCP方式.还是UDP的方式推送,都可以非常好地进行直播转发: 但并不是所有的用户服务器都是阿里云的形式,有很 ...
- 九度OJ 1089:数字反转 (数字反转)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3059 解决:1678 题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个 ...
- Interface AutoCloseable
https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html https://docs.oracle.com/javase ...
- java web service
1.编写服务代码 服务代码提供了两个函数,分别为sayHello和sayHelloToPerson,源代码如下: /* * File name: HelloService.java * * Versi ...