2015-04-21 1 views
0

Je voudrais attraper le signal envoyé à mon programme et faire une action simple (par exemple quitter avec le code spécifié). Mais si le processus recevait un signal avant que mon gestionnaire de signal ne soit activé, il sortait anormalement comme si aucun gestionnaire n'existait.Est-il possible de toujours attraper le signal même si le programme vient de démarrer?

code source de mon programme simple:

#include <signal.h> 
#include <stdlib.h> 
#include <unistd.h> 

void handler(int sig) { exit(0); } 

int main() 
{ 
    signal(SIGTERM, handler); 
    while(1) { sleep(1); } 
    return 0; 
} 

Compilé avec la commande g++ my.c.

Script pour exécuter le programme en continu:

while true; do ./a.out; echo $?; done 

Si j'envoie manuellement un signal à traiter alors la plupart du temps tout est ok - sorti avec le code zéro. Mais si j'utilise script ci-dessous:

Script pour le signal fréquent envoi à traiter:

while true; do slay -sSIGTERM a.out; done 

J'ai beaucoup d'Terminated 143 messages. Mais si j'utilise gcc (au lieu de g ++) je ne pourrais pas obtenir la situation avec un code de sortie différent de zéro.

À cet égard, la question de savoir comment obtenir un comportement C++ (compilé g ++) programme similaire avec le programme C (compilé gcc)?

De préférence dans l'approche standard maximale.

Testé sur QNX 6.5, gcc 4.7.2

Répondre

1

La seule façon d'obtenir ce que vous voulez est d'avoir le bloc de processus parent tous les signaux (sigprocmask) avant de bifurquer et d'attendre pour les débloquer qu'après la mise en place le signal les gestionnaires. Rien de purement dans votre propre programme serait inutile puisque le signal pourrait encore arriver entre la fenêtre où le parent forks et où il exécute.

+0

Mais pourquoi y a-t-il un comportement si différent lors de l'utilisation de c au lieu de C++? Une initialisation plus compliquée dans le cas de C++? s'il est possible de le simplifier? – alexolut

+0

Juste un timing différent en raison de différentes quantités de code en cours d'exécution, je suppose. Le comportement que vous voulez n'est ** pas possible ** sans l'aide du parent, mais cela ne signifie pas que l'échec est facile à observer. C'est la nature des petites fenêtres de course. –