Mail Archives: cygwin-developers/1999/08/27/05:41:28
Hello,
There is a problem with setjmp/longjmp/signals/exceptions that can be
demonstrated by the following code:
static jmp_buf env;
static sigset_t set = {0};
static void sig_handler(int sig)
{
sigprocmask(SIG_UNBLOCK, &set, 0);
longjmp(env, sig);
}
int main(int argc, char * * argv)
{
sigaddset(&set, SIGSEGV);
for ( int i = 0 ; i < 2; i++)
{
if ( setjmp(env) == 0 )
{
signal(SIGSEGV, ssig_handler);
printf("exception ...");
*(int*)0 = 1;
}
else
{
printf("trapped\n");
}
}
return 0;
}
It traps exception only once and than hangs. The problem seems to be in
longjmp code.
If I load CRTDLL.DLL dynamically and use setjmp/longjmp from
there all works. I traced MS longjmp and noticed that it calls RtlUnwind
which seems do the trick.
In addition this code works on Linux without signal unblocking - it is
necessary only if SIGSEGV is signaled by raise.
Does anyone have any opinion about this matter?
Regards
Vadim
--
*********************************************
Vadim Egorov, 1C * ÷ÁÄÉÍ åÇÏÒÏ×,1C
egorovv AT 1c DOT ru * egorovv AT 1c DOT ru
*********************************************
- Raw text -