Messages in this thread | | | Subject | Re: K 2.6 test6 strange signal behaviour | From | Ken Foskey <> | Date | Tue, 21 Oct 2003 11:56:10 +1000 |
| |
On Tue, 2003-10-21 at 06:28, Andrew Morton wrote: > Ken Foskey <foskey@optushome.com.au> wrote: > > > > I have a problem with signals. > > You should be using sigsetjmp(), not setjmp().
No difference. Note that this is K 2.6 specific, it "works" in K 2.4.
I am reading on sigaction now, I will recode with SA_RESTART tonight. I think this is not the solution because I am explicitly setting the signal handler before every call. I think this simply leaves the signal handler active ie old BSD style.
I also received this comment:
> Unblock the signal handler before you raise the signal again.
I think this means sigprocmask with UNBLOCK. "Should" this be required. After reading and Andrews comments I added a reset and siglongjmp here is my current handler:
static void SignalHdl( int sig ) { bSignal = 1; fprintf( stderr, "Signal %d caught\n", sig ); signal( sig, SIG_DFL ); /* reset handler back */ siglongjmp( check_env, sig ); /* return to code */ }
I do have a work around, I am pursuing this because the signal handler is behaving differently in K 2.6 than K 2.4. The error may be mine however it may also be a bug with the kernel.
-- Thanks KenF OpenOffice.org developer
Current code:
#include <stdio.h> #include <signal.h> #include <setjmp.h>
/************************************************************************* |* Typdeclarations for memory access test functions *************************************************************************/ typedef int (*TestFunc)( void* );
/************************************************************************* *************************************************************************/ static sigjmp_buf check_env; static int bSignal; static void SignalHdl( int sig ) { bSignal = 1; fprintf( stderr, "Signal %d caught\n", sig ); signal( sig, SIG_DFL ); siglongjmp( check_env, sig ); }
/************************************************************************* *************************************************************************/ void check( TestFunc func, void* p ) { int result;
fprintf( stderr, "Setting Jump\n" ); if ( !sigsetjmp( check_env, 0 ) ) { signal( SIGSEGV, SignalHdl ); signal( SIGBUS, SignalHdl ); fprintf( stderr, "Running \n" ); result = func( p ); fprintf( stderr, "Finished \n" ); signal( SIGSEGV, SIG_DFL ); signal( SIGBUS, SIG_DFL ); } fprintf( stderr, "After jump \n" ); }
/************************************************************************* *************************************************************************/ static int GetAtAddress( void* p ) { return *((char*)p); }
/************************************************************************* *************************************************************************/ static int SetAtAddress( void* p ) { return *((char*)p) = 0; }
/************************************************************************* *************************************************************************/ void CheckGetAccess( void* p ) { check( (TestFunc)GetAtAddress, p ); } /************************************************************************* *************************************************************************/ void CheckSetAccess( void* p ) { check( (TestFunc)SetAtAddress, p ); }
/************************************************************************* *************************************************************************/ int main( int argc, char* argv[] ) { { char* p = NULL; fprintf( stderr, "Getting from NULL\n" ); CheckGetAccess( p ); fprintf( stderr, "Setting to NULL\n" ); CheckSetAccess( p ); fprintf( stderr, "After Setting to NULL\n" ); }
exit( 0 ); }
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |