pthread_sigmask:异常行为

pthread_sigmask:unusual behavior

本文关键字:异常 sigmask pthread      更新时间:2023-10-16

我正在使用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() functionn"<<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 %sn"<< 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,空,线程屏蔽,空);" 它工作正常并阻止信号。我在这里观察到的另一件事是,如果我pthread_sigmask更改为 sigprocmask 行为保持不变。

线程从创建它们的线程继承信号掩码。

因此,当您的代码在调用pthread_create()之后调用pthread_sigmask()新创建的线程不会修改其信号掩码。

像这样更改代码,使事情按预期工作:

...
pthread_sigmask( SIG_BLOCK, &new_set, &old_set);
pthread_t a;
pthread_create(&a, NULL, threadmasked, NULL);
...