Comment bloquer tous les SIGNAUX SANS fil à l'aide de SIGWAIT?

J'ai une application principale qui génère un sujet séparé pour traiter les messages d'une file d'attente. J'ai un problème sur AIX, quand j'appuie sur CTRL-C, il semble que certains de connexion "poignées" dans le fil de devenir invalide. J'ai un crochet d'arrêt dans le programme principal attraper le SIGINT mais sur AIX il semble en quelque sorte d'envoyer un signal sur le fil...mais ce n'est pas vraiment possible de ce que j'entends...

Essentiellement, je voudrais savoir si je veux le PRINCIPAL de l'application pour gérer TOUS les signaux, je suis intéressé et qui ont le thread/s ne JAMAIS manipuler tous les signaux...est qu'une "bonne pratique"?

Si oui, comment puis-je PAS utiliser "sigwait" dans le fil...en fait je ne veux pas de "code de signal" dans le thread/s...ils doivent tout simplement pas recevoir de signal du tout.

J'ai vidé tous les signaux:

sigemptyset(&set);

Et ont établi la SIG_BLOCK

s = pthread_sigmask(SIG_BLOCK, &set, NULL);

Donc, ici, est un mannequin d'essai gratuit:

#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();
}

Si je viens de créer un thread et ont, par exemple, le gestionnaire de signal SIGINT dans le thread PRINCIPAL, mais ne le font PAS a la SIG_BLOCK ensemble pour le thread et que l'utilisateur appuie sur CTRL-C....le fil affectée à tous, même si le gestionnaire de signal dans le thread principal d'exécution? Cela semble être ce que je vois sur AIX ;-(

Merci pour l'aide, beaucoup apprécié

Lynton

OriginalL'auteur Lynton Grice | 2011-11-11