Shabaz ha colpito il chiodo sulla testa. Tuttavia, se siete alla ricerca di qualcosa di tutte le librerie potrebbero usare (a patto di avere accesso al codice sorgente), si potrebbe fare qualcosa secondo le seguenti linee:
linked_list* sigint_handlers = NULL;
void sighand_init(sighand_config_t* config) {
struct sigaction action;
memset(&signalaction, 0, sizeof(signalaction));
action.sa_handler = &sighand_main;
// Order is important, in case we get a signal during start-up
sigint_handlers = linked_list_new();
sigaction(SIGINT, &action);
}
void sighand_main(int signum) {
if (signum == SIGINT) {
linked_list_node* node = linked_list_head(sigint_handlers);
while ((node = node->next) != NULL) {
node->object(signum);
}
if (sighand_config.exitonint) {
app_exit(0);
}
}
}
void sighand_add_int_handler(void (*handler)(int)) {
if (handler == NULL) return;
linked_list_add(sigint_handlers, handler);
}
void sighand_destroy() {
...
linked_list_destroy(signint_handlers);
...
}
Oppure, si potrebbe utilizzare da soli, e dopo aver caricato ciascuna libreria, ottenere il gestore e in seguito chiamare add_handler. Qualcosa sulla falsariga di:
loadlibrary(lib1.so);
sigaction1 = signalget(SIGINT);
loadlibrary(lib2.so);
sigaction2 = signalget(SIGINT);
sighand_init(...);
sighand_add_int_handler(sigaction1.sa_handler);
sighand_add_int_handler(sigaction2.sa_handler);
Solo alcuni pensieri, Anthony
Non ci manca un ritorno '; se (lib1_sighandler)' blocco ''? –
@rajraj, no, perché? Dobbiamo chiamare ** entrambi i ** gestori. "If" si limita a far sì che i puntatori non siano NULL. Per ogni evenienza, dal momento che non vuoi entrare in crash all'interno di un gestore di segnali. – Shahbaz