Linux で作業しており、シグナル処理に関連するコードを試しています。次のコードを試していますが、このコードの動作を理解できません。
/**Globally declared variable**/
time_t start, finish;
struct sigaction sact;
sigset_t new_set, old_set,test;
double diff;
/**Function to Catch Signal**/
void catcher( int sig )
{
cout<< "inside catcher() function\n"<<endl;
}
void Initialize_Signalhandler()
{
sigemptyset( &sact.sa_mask );
sact.sa_flags = 0;
sact.sa_handler = catcher;
sigaction( SIGALRM, &sact, NULL );
sigemptyset( &new_set );
sigaddset( &new_set, SIGALRM );
}
/**Function called by thread**/
void *threadmasked(void *parm)
{
/**To produce delay of 10sec**/
do {
time( &finish );
diff = difftime( finish, start );
} while (diff < 10);
cout<<"Thread Exit"<<endl;
}
int main( int argc, char *argv[] ) {
Initialize_Signalhandler();
pthread_t a;
pthread_create(&a, NULL, threadmasked, NULL);
pthread_sigmask( SIG_BLOCK, &new_set, &old_set);
time( &start );
cout<<"SIGALRM signals blocked at %s\n"<< ctime(&start) <<endl;
alarm(2); //to raise SIGALM signal
/**To produce delay of 10sec**/
do {
time( &finish );
diff = difftime( finish, start );
} while (diff < 10);
return( 0 );
}
私は「 pthread_sigmask( SIG_BLOCK, &new_set, &old_set) 」を使用しています。信号をブロックしていません。しかし、「pthread_create(&a, NULL, threadmasked, NULL);」を削除すると 正常に動作し、信号をブロックしています。ここで私が観察したもう 1 つのことは、 pthread_sigmaskをsigprocmaskに変更しても動作は変わらないことです。