2010-12-17 8 views
1

Le cas est le suivant: J'enregistre un gestionnaire de signal avec fonction de signal. La question:Traitement du signal

  1. gestionnaire est toujours appelé indépendamment de l'état du processus? (Je veux dire son arrêté, etc.) Que se passe-t-il? (En fonction de l'état)

  2. Les fonctions de gestionnaire sont-elles enregistrées comme certaines "fonctions spéciales" par système (c'est-à-dire que lorsque le manipulateur exécute d'autres signaux ne sont pas reçus et sont mis dans la pile ou comme cela. ils sont simplement ignorés.) Si ce n'est pas le cas, imaginez que lorsque le gestionnaire reçoit un autre signal, alors ce gestionnaire est appelé de nouveau "le premier" n'a pas encore terminé sa tâche et ainsi de suite.

Répondre

4
  1. « Même si un processus est arrêté, tous les signaux supplémentaires qui sont envoyés au processus ne doivent pas être livrés jusqu'à ce que le processus se poursuit, à l'exception SIGKILL (...) L'action par défaut pour SIGCONT est à reprendre l'exécution au point où le processus a été arrêté, après avoir d'abord traité tous les signaux non bloqués en attente. " (Unix standard, section Signal Concepts.)

  2. Ordinairement, rien de spécial ne se produit. Lorsqu'un signal X est intercepté dans un gestionnaire de signal pour Y, l'exécution est simplement transférée au gestionnaire pour X, après quoi le gestionnaire de Y reprend l'exécution.

Le programme suivant présente ce comportement. raise(sig) envoie un signal au processus appelant (c'est comme kill(getpid(), sig)).

void hello(int unused) 
{ 
    printf("Hello, "); 
    raise(SIGUSR2); 
    printf("!\n"); 
} 

void world(int unused) 
{ 
    printf("world"); 
} 

int main() 
{ 
    signal(SIGUSR1, hello); 
    signal(SIGUSR2, world); 
    raise(SIGUSR1); 

    return 0; 
} 

Ceci est « sûr », car un processus accepte uniquement les signaux de processus avec le même ID utilisateur (ou root), de sorte que vous ne pouvez vous tirer dans le pied de cette façon.

+0

Et si X == Y? (C'est-à-dire que le même gestionnaire veut commencer?) – DimG

+0

Même chose. Essayez de gérer un signal avec 'handle vide (int sig) {raise (sig); } ' –

+0

Merci beaucoup) – DimG

Questions connexes