- 论坛徽章:
- 0
|
我把代码贴出来,呵呵
虽然代码有点长,但是结构很简单,大家可要耐着性子看下哦
int sig_handler1_called = 0;
void sig_handler1(int signo)
{
sig_handler1_called++;
}
void *sig_test1_t1(){
struct sigaction act;
sigset_t fillset,emptyset;
sigemptyset( &emptyset );
sigaddset( &emptyset, SIGTERM );
sigfillset( &fillset );
sigdelset( &fillset, SIGTERM );
act.sa_handler = sig_handler1;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
if( sigaction( SIGTERM, &act, 0 ) == -1 ){
printf( "## sig_test1 : t1 sigaction error rtnval = -1\n" );
pthread_exit((void*)1);
}
pthread_sigmask(SIG_BLOCK, &fillset, NULL);
pthread_sigmask(SIG_UNBLOCK, &emptyset, NULL);
sleep(10);
pthread_exit((void*)0);
}
void *sig_test1_t2(){
struct sigaction act;
sigset_t fillset,emptyset;
sigemptyset( &emptyset );
sigaddset( &emptyset, SIGTERM );
sigfillset( &fillset );
sigdelset( &fillset, SIGTERM );
act.sa_handler = sig_handler1;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
if( sigaction( SIGTERM, &act, 0 ) == -1 ){
printf( "## sig_test1 : t2 sigaction error rtnval = -1\n" );
pthread_exit((void*)1);
}
pthread_sigmask( SIG_BLOCK, &fillset, NULL );
pthread_sigmask( SIG_UNBLOCK, &emptyset, NULL );
sleep(10);
pthread_exit((void*)0);
}
void *sig_test1_t3(){
struct sigaction act;
sigset_t fillset,emptyset;
sigemptyset( &emptyset );
sigaddset( &emptyset, SIGTERM );
sigfillset( &fillset );
sigdelset( &fillset, SIGTERM );
act.sa_handler = sig_handler1;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
if( sigaction( SIGTERM, &act, 0 ) == -1 ){
printf( "## sig_test1 : t3 sigaction error rtnval = -1\n" );
pthread_exit((void*)1);
}
pthread_sigmask( SIG_SETMASK, &fillset, NULL );
pthread_sigmask( SIG_UNBLOCK, &emptyset, NULL );
sleep(10);
pthread_exit((void*)0);
}
void sig_test1(void){
int rtnval;
int *th_ret;
pthread_t thID[3];
sigset_t set;
rtnval = sigfillset( &set );
if( rtnval != 0 ){
printf( "## sig_test1 : main sigfillset error rtnval = %d\n", rtnval );
return;
}
rtnval = pthread_sigmask( SIG_BLOCK, &set, NULL );
if( rtnval != 0 ){
printf( "## sig_test1 : main pthread_sigmask error rtnval = %d\n", rtnval );
return;
}
rtnval = pthread_create( &thID[0], NULL, sig_test1_t1, NULL );
if( rtnval != 0 ){
printf( "## sig_test1 : t1 pthread_create error rtnval = %d\n", rtnval );
return;
}
rtnval = pthread_create( &thID[1], NULL, sig_test1_t2, NULL );
if( rtnval != 0 ){
printf( "## sig_test1 : t2 pthread_create error rtnval = %d\n", rtnval );
return;
}
rtnval = pthread_create( &thID[2], NULL, sig_test1_t3, NULL );
if( rtnval != 0 ){
printf( "## sig_test1 : t3 pthread_create error rtnval = %d\n", rtnval );
return;
}
sleep(3);
if( kill( getpid(), SIGTERM ) == -1 ){
printf( "## sig_test1 : main pthread_kill error rtnval = -1 \n" );
return;
}
rtnval = pthread_join( thID[0], (void*)&th_ret );
if( rtnval != 0 ){
printf( "## sig_test1 : t1 pthread_join error rtnval = %d\n", rtnval );
return;
}
rtnval = pthread_join( thID[1], (void*)&th_ret );
if( rtnval != 0 ){
printf( "## sig_test1 : t2 pthread_join error rtnval = %d\n", rtnval );
return;
}
rtnval = pthread_join( thID[2], (void*)&th_ret );
if( rtnval != 0 ){
printf( "## sig_test1 : t3 pthread_join error rtnval = %d\n", rtnval );
return;
}
if( th_ret != 0 || sig_handler1_called != 1 ){
printf( "## sig_test1 : t1 TEST FAIL \n" );
return;
}
printf( "## sig_test1 : PASS!\n" );
} |
|