Je dois exécuter des fonctions de nettoyage dans le gestionnaire SIGINT, mais je ne peux pas lui transmettre de données locales. Voici un exemple:Comment nettoyer les données locales dans le gestionnaire SIGINT
int main(int argc, char *argv[]) {
struct database *db = db_cursor();
sockfd_t master_socket = init_server();
signal(SIGINT, sigint_handler);
while (1) {
// accepting connections
}
}
void sigint_handler(int s) {
destroy_db(db);
shutdown(master_socket, SHUT_RDWR);
close(master_socket);
exit(EXIT_SUCCESS);
}
Comment puis-je implémenter un tel comportement? J'ai essayé de rendre ces variables globales, mais Je ne peux pas appeler cette fonction au moment de la compilation (erreur: l'élément initializer n'est pas une constante de compilation).
Vous ne devriez pas faire tout cette logique dans le gestionnaire lui-même. Ayez juste un drapeau et testez le drapeau dans la boucle principale. –
Ajout au commentaire d'Oliver: Tapez le drapeau 'sig_atomic_t'. – alk
Maintenant cela fonctionne, mais j'ai des appels bloquants comme 'accept', et quand j'appelle' SIGINT' il ne s'arrête pas immédiatement. Devrais-je utiliser le multiplexage pour résoudre ce problème? – 0x1337