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
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
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. –