Re: K 2.6 test6 strange signal behaviour
From: Ken Foskey
Date: Mon Oct 20 2003 - 20:56:57 EST
On Tue, 2003-10-21 at 06:28, Andrew Morton wrote:
> Ken Foskey <foskey@xxxxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/