0

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_sigmasksigprocmaskに変更しても動作は変わらないことです。

4

1 に答える 1

2

スレッドは、作成元のスレッドからシグナル マスクを継承します。

そのため、新しく作成されたスレッドを呼び出したpthread_sigmask() にコードが呼び出すとpthread_create()、シグナルマスクは変更されません。

コードを次のように変更して、期待どおりに動作させてください。

...

pthread_sigmask( SIG_BLOCK, &new_set, &old_set);

pthread_t a;
pthread_create(&a, NULL, threadmasked, NULL);

...
于 2013-01-24T06:42:12.640 に答える