शाहबाज सिर पर कील मारा। हालांकि, अगर आप कुछ अपने सभी पुस्तकालयों इस्तेमाल कर सकते हैं के लिए देख रहे हैं (बशर्ते आप स्रोत कोड की पहुंच है), तो आप निम्नलिखित लाइनों के साथ कुछ कर सकते हैं: यदि आप अपने आप को इस का उपयोग कर सकते
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);
...
}
या, और प्रत्येक लाइब्रेरी को लोड करने के बाद, हैंडलर प्राप्त करें और बाद में add_handler को कॉल करें। की तर्ज पर कुछ: `` में अगर (lib1_sighandler) `ब्लॉक
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);
बस कुछ विचार, एंथोनी
हम एक' लौट याद आती है? –
@राजराज, नहीं, क्यों? हमें ** ** ** दोनों हैंडलर कॉल करने की आवश्यकता है। 'If' केवल यह सुनिश्चित करता है कि पॉइंटर्स न्यूल नहीं हैं। बस मामले में, क्योंकि आप सिग्नल हैंडलर के अंदर क्रैश नहीं करना चाहते हैं। – Shahbaz