Я пишу многопоточную программу, которую нужно завершить следующей строкой bash:
killall -QUIT -w procname
Я решил использовать поток для получения некоторых сигналов, которые мне нужно обработать, таких как SIGQUIT и SIGUSR1, и игнорировать SIGQUIT в других. Чтобы игнорировать сигнал, я написал это:
struct sigaction s;
s.sa_handler=SIG_IGN;
if((sigaction(SIGQUIT,&s,NULL))==-1) {
perror("sigaction");
return -1;
}
И я написал следующий код в потоке, предназначенном для ожидания сигналов (handlerrno — это функция для проверки errno и выхода):
sigset_t threadset;
int err, sig;
if(sigfillset(&threadset)==-1) handlerrno("Sigfillset thread stats");
if(sigdelset(&threadset,SIGQUIT)==-1) handlerrno("Sigdelset thread stats");
if(sigdelset(&threadset,SIGINT)==-1) handlerrno("Sigdelset thread stats");
if(sigdelset(&threadset,SIGTERM)==-1) handlerrno("Sigdelset thread stats");
if(sigdelset(&threadset,SIGUSR1)==-1) handlerrno("Sigdelset thread stats");
if((err=pthread_sigmask(SIG_SETMASK,&threadset,NULL))!=0)
handlerror(err,"Set sigmask thread stats");
if((err=sigwait(&threadset,&sig))!=0) handlerror(err,"Sigwait");
//I handle the signals here
Однако, когда я запускаю SIGQUIT из оболочки, поток, предназначенный для ожидания сигналов, кажется застрявшим в sigwait(), поэтому я действительно не знаю, что происходит и какой поток получает сигнал. Что-то не так с кодом? Спасибо!