Ana*_*tel 7 windows signals console-application ctrl
我创建了一个C#控制台应用程序来处理Ctrl- C通过订阅它来控制Console.CancelKeyPress事件.当我执行(调试版本)应用程序时,在该过程中已经创建了14个线程.当我按下时Ctrl- C创建了一个新的第15个线程并调用了我的处理程序.我使用sysinternals中的进程资源管理器来查看进程的状态.
我很想知道如何将Ctrl- C消息传递给进程以及如何创建其他线程的内部结构?我想,即使我没有订阅一个事件,它仍然会创建一个额外的线程并退出该进程.如何处理上的默认机制Ctrl- C是建立一个应用程序.
我是.net开发人员,但想了解Windows操作系统是如何工作的.以上问题仅仅是出于好奇学习Windows操作系统.
当Windows需要向控制台程序通知外部事件时,没有窗口消息循环来发送通知,因此Windows将在目标进程中创建一个线程来执行定义的任何回调函数。CTRL+C 事件的默认处理程序仅调用ExitProcess,但挂钩事件会通过处理程序函数CancelKeyPress调用 Win32函数。SetConsoleCtrlHandler
处理函数的文档解释了它的工作原理:
与 SetConsoleCtrlHandler 函数一起使用的应用程序定义的函数。控制台进程使用此函数来处理进程接收到的控制信号。当接收到信号时,系统在进程中创建一个新线程来执行该函数。
请注意,Windows 注入到进程中的线程具有相当小的堆栈,因此 CLR 处理程序例程实际上会将线程池工作项排队以执行事件处理程序。这意味着 Windows 注入的线程和工作线程都可以被创建,导致您在处理 CTRL+C 事件期间看到最多 2 个附加线程。
| 归档时间: |
|
| 查看次数: |
1255 次 |
| 最近记录: |