有什么方法可以在 C 中创建回调和信号吗?
我当然可以使用函数指针,但我想创建一个可以容纳多个函数的信号,即可以绑定(bind)到多个事件。类似于 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;
}
注意:没有错误处理,也没有释放分配的内存。这留给读者作为练习。 :-)
关于c - C 中的信号和回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111878/