c - C 中的信号和回调?

标签 c events event-handling callback signals

有什么方法可以在 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/

相关文章:

c++ - 适用于事件管理的设计模式

c - 如何在C中使用pthread来统计单词出现的次数?

c - K 和 R 中的这个例子是如何工作的

c - 使用套接字选项的路径MTU发现-IP_MTU和IP_MTU_DISCOVER

events - GWT FocusPanel、Tab 键和焦点处理程序

c# - 如何在 C# 中实现抽象事件或接口(interface)方法事件?

javascript - 将外部图像加载到工具提示 onMouseOver 事件处理程序中

c - Makefile链接器无法在静态库中找到函数

events - Vue-tables-2网格组件使用,Event总线如何使用?

javascript - 如何在 jQueryUI selectable 中捕获选择事件?