Le thread qui gère le signal?

J'ai 2 fils(thread1 et thread2). Et j'ai signal disposition pour SIGINT. Chaque fois que SIGINT se produit thread 2 doit traiter le signal. Pour que j'ai écrit ci-dessous le programme de

void sig_hand(int no)                  //signal handler
{
    printf("handler executing...\n");
    getchar();
}

void* thread1(void *arg1)              //thread1 
{
    while(1) {
            printf("thread1 active\n");
            sleep(1);
    }
}

void * thread2(void * arg2)           //thread2
{
    signal(2, sig_hand);
    while(1) {
    printf("thread2 active\n");
    sleep(3);
    }
}

int main()
{
    pthread_t t1;
    pthread_t t1;

    pthread_create(&t1, NULL, thread1, NULL);
    pthread_create(&t2, NULL, thread2, NULL);
    while(1);
}

J'ai compilé et et exécuter le programme. pour chaque 1 seconde "thread1 active" est en cours d'impression et pour toutes les 3 secondes "thread2 active" est en cours d'impression.

Maintenant, j'ai généré un SIGINT. Mais son impression "thread1 active" et "thread2 active" des messages comme ci-dessus. De nouveau, j'ai généré un SIGINT, maintenant, pour toutes les 3 secondes seulement "thread2 active" message est en cours d'impression. De nouveau, j'ai généré un SIGINT, maintenant, tous les threads sont bloqués.

Donc j'ai compris, pour la première fois thread principal de l'exécution de gestionnaire de signal. Pour la deuxième fois thread1 l'exécution de gestionnaire et enfin thread2 l'exécution de gestionnaire de signal.

Comment je peux écrire le code comme à chaque fois que le signal se produit, seulement thread2 ont à exécuter mon gestionnaire de signal?

  • printf n'est pas un async-fort appel de la bibliothèque, le sens qu'il ne doit PAS être appelée par un gestionnaire de signal... si elle l'est, le comportement est indéterminé (mauvaises choses peuvent se produire). getchar n'est pas asynchrone de sécurité, pour cette question.
  • traitement du Signal avec plusieurs threads sous Linux
InformationsquelleAutor gangadhars | 2014-02-25