Я использую pthread_create, чтобы получить 2 потока и зарегистрировать обработчик сигнала в обоих созданных потоках.
В основном потоке обработчик сигнала не установлен.
#include <signal.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
void sig_hand(int no) //signal handler
{
printf("handler executing...\n");
printf("%d\n", pthread_self());
pthread_exit(NULL);
}
void* thread1(void *arg1) //thread1
{
signal(SIGINT, sig_hand);
printf("%d\n", pthread_self());
}
void * thread2(void * arg2) //thread2
{
signal(SIGINT , sig_hand);
printf("%d\n", pthread_self());
}
int main()
{
pthread_t t1;
pthread_t t2;
sigset_t newmask;
sigaddset(&newmask, SIGINT);
// set sigproc, SIGINT can be received;
// sigproc not set, SIGINT can't be received
if(sigprocmask(SIG_BLOCK, &newmask, NULL) < 0){
perror("sigprocmask error");
}
printf("main thread %d\n", pthread_self());
pthread_create(&t1, NULL, thread1, NULL);
pthread_create(&t2, NULL, thread2, NULL);
while(1);
}
Если я не установил sigprocmask в основном потоке, SIGINT может быть получен, но он обрабатывается основным потоком, пока основной поток не регистрирует функцию-обработчик.
main thread -1335200000
-1343535360
-1351928064
^Cpthread -1335200000 handler executing...
Однако, если sigprocmask установлен в основном потоке, SIGINT не может быть получен, пока два дочерних потока имеют зарегистрированную функцию-обработчик.
main thread 2061661952
2053326592
2044933888
^C^C
Это очень запутанно.