C.中的信号和回调



有什么方法可以在C中创建回调和信号吗?

当然,我可以使用函数指针,但我想创建一个可以容纳多个函数的信号,即可以绑定到多个事件。类似于boost.signals,但在C中。有任何方式吗?

C中有许多gui库使用回调,它们是如何实现的?

一个简单的解决方案是保留一个要调用的函数列表,在信号处理程序中只需迭代该列表即可调用每个函数。

类似这样的东西:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
typedef void (*event_callback_t)();
struct event_handler_node
{
    event_callback_t callback;
    struct event_handler_node *next;
};
void add_event_handler(struct event_handler_node **list_head,
                       event_callback_t callback)
{
    struct event_handler_node *node = malloc(sizeof(struct event_handler_node));
    node->callback = callback;
    if (*list_head != NULL)
        node->next = *list_head;
    *list_head = node;
}
void call_all_event_handlers(struct event_handler_node *list_head)
{
    struct event_handler_node *node;
    for (node = list_head; node != NULL; node = node->next)
    {
        (*node->callback)();
    }
}
struct event_handler_node *signal_callbacks = NULL;
void signal_handler(int signum)
{
    call_all_event_handlers(signal_callbacks);
}
void my_callback()
{
    printf("Hello from callback!n");
}
int main()
{
    /* Add a callback to the list */
    add_event_handler(&signal_callbacks, my_callback);
    /* Set signal handler for a signal */
    signal(SIGUSR1, signal_handler);
    /* Invoke the signal handler */
    kill(getpid(), SIGUSR1);
    return 1;
}

注意:没有错误处理,也没有释放分配的内存。这是留给读者的练习。:-)

正如Joachim所说,您应该保存函数指针列表。C中没有本机动态数组,但您可以自己实现:

struct list {
 void (*func)(void);
 struct list *next;
} *cb=NULL;
void add_callback(void (*f)(void)) {
 struct list *newCallback=(struct list *)malloc(sizeof(struct list));
 newCallback->func=f;
 newCallback->next=cb;
 cb=newCallback;
}
void call_callbacks() {
 struct list *t=cb;
 while (t) {
  (*(t->func))();
  t=t->next;
 }
}

相关内容

  • 没有找到相关文章

最新更新