У меня есть главное приложение, которое порождает отдельный поток для обработки сообщений из очереди. У меня есть проблема на AIX, когда я нажимаю CTRL-C, так как кажется, что некоторые "ручки соединения" в потоке становятся недействительными. У меня есть крючок выключения в основной программе, отлавливающий SIGINT, но на AIX он, похоже, должен каким-то образом посылать сигнал и потоку... хотя это не совсем возможно, как я слышал...
По существу, я хотел бы знать, хочу ли я, чтобы главное приложение обрабатывало ВСЕ интересующие меня сигналы, а поток/потоки НИКОГДА не обрабатывали никаких сигналов... это "хорошая практика"?
Если да, то как я могу НЕ использовать "sigwait" в потоке... на самом деле я не хочу никакого "сигнального кода" в потоке/потоках... они просто не должны получать никаких сигналов вообще.
Я очистил все сигналы:
sigemptyset(&set);
И установил SIG_BLOCK
s = pthread_sigmask(SIG_BLOCK, &set, NULL);
Итак, вот фиктивная тестовая программа:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#define handle_error_en(en, msg) do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
static void * threadMainLoop(){
//Here I do not want the thread to use "sigwait"....
while(running == TRUE){
//do some thread work and never have any signals come in
}
}
void shutdownHook(int sig){
printf("\nCtrl-C pressed....shutdown hook in main...\n");
}
void signalErrorHandler(int signum){
printf("\nSignal error handler in main...\n");
}
int main(int argc, char *argv[]){
pthread_t thread;
sigset_t set;
int s;
//Catch the following signals in the MAIN thread
(void) signal(SIGINT, shutdownHook);
(void) signal(SIGSEGV, signalErrorHandler);
(void) signal(SIGBUS, signalErrorHandler);
(void) signal(SIGILL, signalErrorHandler);
(void) signal(SIGTERM, signalErrorHandler);
(void) signal(SIGABRT, signalErrorHandler);
sigemptyset(&set); //BLOCK all signals
s = pthread_sigmask(SIG_BLOCK, &set, NULL);
if (s != 0)
handle_error_en(s, "pthread_sigmask");
s = pthread_create(&thread, NULL, &threadMainLoop, (void *) NULL);
if (s != 0)
handle_error_en(s, "pthread_create");
pause();
}
Если я просто создаю поток и имею, например, обработчик сигнала SIGINT в основном потоке, но НЕ имею SIG_BLOCK, установленный для потока, и пользователь нажимает CTRL-C...., будет ли поток затронут вообще, даже если обработчик сигнала в основном потоке работает? Это похоже на то, что я наблюдаю на AIX ;-(
Спасибо за помощь, очень признателен
Lynton