2011-12-27 6 views
1

pthread_createのマニュアルページでは、「新しいスレッドの保留中の信号のセットは空です」です。 しかし、テスト用のコードをいくつか書いたところ、新しいスレッドの信号保留リストが空でないという反対の結果が得られました。コードは以下の通りです。シグナルが作成された新しいスレッドの保留中のリストは空ではありませんか?

void* thread_fun(void* arg) 
{ 
    int s; 
    sigset_t pendingset; 

    s = sigemptyset(&pendingset); 
    if(s != 0) 
    { 
     printf("sigempty error.\n"); 
    } 
    else{ 
     s = sigpending(&pendingset); 
     if(s == 0){ 
      if(sigismember(&pendingset, SIGINT)) 
       printf("SIGINT in pending signal list.\n"); // this msg is printed 
     } 
    } 

    return NULL; 
} 

int main() 
{ 
    pthread_t tid; 
    sigset_t set; 
    sigemptyset(&set); 
    sigaddset(&set, SIGINT); 
    pthread_sigmask(SIG_BLOCK, &set, NULL); 

    sleep(10); // send SIGINT to the process using kill -SIGINT pid 
    printf("before create thread...\n"); 
    pthread_create(&tid, NULL, thread_fun, NULL); 

    pthread_join(tid, NULL); 

    return 0; 
} 

スリープ期間中、私はプロセスにSIGINTを送りました。その時点で、SIGINTを含むシグママスクセットは、その時点で受信したSIGINTシグナルがシグナルリストに保留されていたためです。 pthread_createの後、新しいスレッドでsigpendingは呼び出しスレッドの保留中のシグナルを返し、SIGINTはそのセットに含まれます。だから、それはmanページと矛盾しています。

何か助けていただければ幸いです。

答えて

1

あなたが送信したシグナルはプロセスレベルのシグナルなので、スレッドが作成される前に保留中だったかどうかは、プロセス全体(およびブロックされているすべてのスレッド)で保留中です。 docs for sigpending()は(強調追加)言う:

sigpending()機能が設定された引数、呼び出し元のスレッドへの配信がブロックされ、それがプロセスにを保留している信号のセットによって参照される場所に、保存しなければなりませんまたは呼び出しスレッド。

pthread_create()が呼び出されたときに保留中の信号がスレッドレベルの信号だった場合、新しく作成されたスレッドでは保留されません。これをテストするには、pthread_kill(pthread_self(), SIGINT)機能を使用して信号を送信します。

新しいスレッドで保留中のシグナルが消去されるという言い回しは、これについてはあまり明確ではないことに同意します。

+0

ありがとうございました。また、私はsigpending()のマニュアルページから説明を見つけます。スレッドのために保留中のシグナルのセットは、そのスレッドに対して保留中のシグナルの集合と、そのスレッドに対して保留中のシグナルの集合ですプロセス全体 – Avalon

関連する問題