Re: Using SetConsoleCtrlHandler
- From: "Skywing [MVP]" <skywing_NO_SPAM_@xxxxxxxxxxxxxxxxxxx>
- Date: Wed, 6 Jun 2007 11:44:31 -0400
This seems a bit fishy and not-recommendable to me... Get/SetThreadContext when you are in a system call will not have the expected result, some of the volatile registers (which might be parameter registers for fastcall, or even more problematic on x64) will be overwritten on return from the system call. And setting the context will not take effect until the system call returns anyway. There is also the problem that you don't have a way to wake a thread that was sleeping.
Furthermore, if you happen to catch a thread "at a bad time", such as when it owns an important lock (or even worse, is in the middle of acquiring an important lock, like the critical section for the process heap, such that you break recursive acquisition of it), you're likely to break the process (deadlock).
--
Ken Johnson (Skywing)
Windows SDK MVP
http://www.nynaeve.net
"Tony Proctor" <tony_proctor@xxxxxxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message news:eFnX5$BqHHA.1148@xxxxxxxxxxxxxxxxxxxxxxx
Windows is not very good at handling this sort of asynchronous interrupt on
a single thread Emmanuel (i.e. similar to UNIX signals, or even VMS ASTs)
The question has been asked before:
http://groups.google.ie/group/microsoft.public.win32.programmer.kernel/browse_frm/thread/608ad10204f76515/1e175f06dca6106f?hl=en#1e175f06dca6106f
I've even found myself in the same boat in trying to port a language, and
its framework, to the Windows O/S. In the end, I suspended the thread, read
its context, redirected it to a point that would generate the required
exception, and then released it. Surprisingly, it worked OK in practice
(although not on Alpha AXP H/W) but there were a few issues with win32 api
calls that had to be addressed (mentioned in that old thread)
Tony Proctor
"Emmanuel Stapf [ES]" <manus@xxxxxxxxxxxxxxxxx> wrote in message
news:uQhAUi9pHHA.1144@xxxxxxxxxxxxxxxxxxxxxxx
Hi,Ctrl+C. No
I've a console single threaded application and I'm trying to catch amatter if I use SetConsoleCtrlHandler or a signal handler, my code tohandlethis gets called in another thread. Is there a way to have the handlercalledfrom the main thread?
In the code below, simply comment the call to `signal' or to
`SetConsoleCtrlHandler' to observe the similar behavior. On Unix, using
`signal', it is called from the same thread.
Thanks for any highlight,
Manu
PS: this is shown by the code:
#include <windows.h>
#include <stdio.h>
#include <signal.h>
BOOL CtrlHandler( DWORD fdwCtrlType )
{
switch( fdwCtrlType ) {
case CTRL_C_EVENT:
printf( "Ctrl-C event\n\n" );
return TRUE;
default:
return FALSE;
}
}
void handler (int sig) {
printf ("From Signal\n");
signal (SIGINT, handler);
}
void main( void )
{
signal (SIGINT, handler);
//SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE );
printf("Use Ctrl+C to see what is going on.\n" );
while( 1 ){ }
}
.
- Follow-Ups:
- Re: Using SetConsoleCtrlHandler
- From: Tony Proctor
- Re: Using SetConsoleCtrlHandler
- References:
- Using SetConsoleCtrlHandler
- From: Emmanuel Stapf [ES]
- Re: Using SetConsoleCtrlHandler
- From: Tony Proctor
- Using SetConsoleCtrlHandler
- Prev by Date: Re: Using SetConsoleCtrlHandler
- Next by Date: Re: Using SetConsoleCtrlHandler
- Previous by thread: Re: Using SetConsoleCtrlHandler
- Next by thread: Re: Using SetConsoleCtrlHandler
- Index(es):
Relevant Pages
|
Loading