В справочной странице 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-страницей.
Любая помощь приветствуется.