Comment exécuter une fonction de gestionnaire avant de quitter le programme lors de la réception du signal de neutralisation de «killall» ou de «kill -p pid»?

J’ai le code suivant:

#include  #include  #include  pthread_t test_thread; void *thread_test_run (void *v) { int i=1; while(1) { printf("into thread %d\r\n",i); i++; sleep(1); } return NULL } int main() { pthread_create(&test_thread, NULL, &thread_test_run, NULL); sleep (20); pthread_cancel(test_thread); sleep(100); // In this period (before the finish of myprogram), // I execute killall to kill myprogram // I want to add a signal handle function to // execute pthread_exit() before the program quit } 

Je souhaite compléter mon code en ajoutant une fonction de traitement du signal pour exécuter pthread_exit () avant la fermeture du programme.

Comment faire ?

Comme killall envoie le signal SIGTERM par défaut, vous pouvez gérer ce type de signal.

 #include  void handler(int sig) { /* ... */ } signal (SIGTERM, handler); 

Voici comment j’implémente une sorte de ce que vous voulez dans mon utilitaire https://github.com/seriyps/wrk/commit/1d3c5dda0d46f0e567f3bae793bb3ae182de9438

 static thread *threads; int main(....){ ... sigint_action.sa_handler = &sig_handler; sigemptyset (&sigint_action.sa_mask); /* reset handler in case when pthread_cancel didn't stop threads for some reason */ sigint_action.sa_flags = SA_RESETHAND; sigaction(SIGTERM, &sigint_action, NULL); ... } static void sig_handler(int signum) { printf("interrupted\n"); for (uint64_t i = 0; i < cfg.threads; i++) { if(pthread_cancel(threads[i].thread)) exit(1); } }