微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将Ctrl-C消息传递给在Windows上运行的进程?

我创建了一个C#控制台应用程序,通过将它订阅到Console.CancelKeyPress事件来处理Ctrl-C.当我执行(调试版本)应用程序时,在该过程中已经创建了14个线程.当我按下Ctrl-C时,创建了一个新的第15个线程并调用了我的处理程序.我使用sysinternals中的进程资源管理器来查看进程的状态.

我很想知道关于如何将Ctrl-C消息传递给进程以及如何创建其他线程的内部结构?我想,即使我不订阅某个事件,它仍然会创建一个额外的线程并退出该进程.如何为应用程序设置处理Ctrl-C的认机制.

我是.net开发人员,但想了解Windows操作系统是如何工作的.以上问题仅仅是出于好奇学习Windows操作系统.

解决方法

当Windows需要通知控制台程序外部事件时,没有窗口消息循环发送通知,因此Windows将在目标进程中执行 create a thread以执行任何定义的回调函数. CTRL C事件的认处理程序只调用ExitProcess,但是挂钩CancelKeyPress事件会使用处理函数调用Win32 SetConsoleCtrlHandler函数.

handler function的文档解释了它的工作原理:

An application-defined function used with the SetConsoleCtrlHandler function. A console process uses this function to handle control signals received by the process. When the signal is received,the system creates a new thread in the process to execute the function.

请注意,Windows注入到您的进程中的线程具有相当小的堆栈,因此CLR处理程序例程实际上将Threadpool工作项排队以执行您的事件处理程序.这意味着Windows和工作线程注入的线程都可以创建,导致在处理CTRL C事件期间最多可以看到2个额外的线程.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐