Shabaz nhấn đinh trên đầu. Tuy nhiên, nếu bạn đang tìm kiếm một cái gì đó tất cả các thư viện của bạn có thể sử dụng (với điều kiện bạn có quyền truy cập vào mã nguồn), bạn có thể làm một cái gì đó dọc theo dòng sau đây:
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);
...
}
Hoặc, bạn có thể sử dụng này cho mình, và sau khi tải từng thư viện, hãy xử lý và sau đó gọi add_handler. Một cái gì đó dọc theo dòng:
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);
Chỉ cần một vài suy nghĩ, Anthony
Chúng ta bỏ lỡ một 'trở lại; 'trong' if (lib1_sighandler) 'khối? –
@rajraj, no, why? Chúng ta cần gọi ** cả hai ** xử lý. 'If' chỉ đảm bảo con trỏ không phải là NULL. Chỉ trong trường hợp, vì bạn không muốn va chạm bên trong một bộ xử lý tín hiệu. – Shahbaz