Как блокировать все сигналы в потоке БЕЗ использования SIGWAIT?

У меня есть главное приложение, которое порождает отдельный поток для обработки сообщений из очереди. У меня есть проблема на 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

10
задан wildplasser 11 November 2011 в 12:11
поделиться