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ページと矛盾しています。
何か助けていただければ幸いです。
ありがとうございました。また、私はsigpending()のマニュアルページから説明を見つけます。スレッドのために保留中のシグナルのセットは、そのスレッドに対して保留中のシグナルの集合と、そのスレッドに対して保留中のシグナルの集合ですプロセス全体 – Avalon