This is the mail archive of the
cygwin-developers@sourceware.cygnus.com
mailing list for the Cygwin project.
longjmp problem
- To: "cygwin-developers@sourceware.cygnus.com" <cygwin-developers@sourceware.cygnus.com>
- Subject: longjmp problem
- From: Vadim Egorov <egorovv@1c.ru>
- Date: Fri, 27 Aug 1999 13:40:03 +0400
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@1c.ru * egorovv@1c.ru
*********************************************