相关疑难解决方法(0)

C中的函数指针如何工作?

我最近在C中使用了函数指针.

继续回答你自己的问题的传统,我决定对那些需要快速深入研究这个主题的人进行一些基本的总结.

c function-pointers

1170
推荐指数
10
解决办法
77万
查看次数

如何在Linux上执行异步信号处理程序?

我想知道异步信号处理程序的执行在Linux上是如何工作的.首先,我不清楚哪个线程执行信号处理程序.其次,我想知道使线程执行信号处理程序所遵循的步骤.

关于第一件事,我读了两个看似矛盾的不同解释:

  1. Linux内核,由Andries Brouwer撰写,§5.2"接收信号"状态:

    当信号到达时,进程被中断,保存当前寄存器,并调用信号处理程序.当信号处理程序返回时,中断的活动继续.

  2. StackOverflow上的问题"处理异步信号在多线程程序"使我认为,Linux的行为是像SCO Unix的:

    当信号传递给进程时,如果它被捕获,它将由满足以下任一条件的一个且只有一个线程处理:

    1. sigwait(2)系统调用中阻塞的线程,其参数确实包括捕获信号的类型.

    2. 一个线程,其信号掩码包括捕获信号的类型.

    其他考虑因素

    • sigwait(2)中被阻塞的线程优先于不阻塞信号类型的线程.
    • 如果多个线程满足这些要求(可能两个线程正在调用sigwait(2)),那么将选择其中一个.应用程序无法预测此选择.
    • 如果没有线程符合条件,则信号将在进程级别保持"待定"状态,直到某个线程符合条件.

    此外,Moshe Bar的"Linux信号处理模型"指出 "异步信号被传送到发现没有阻塞信号的第一个线程.",我解释为这意味着信号被传送到某个线程,其信号包括信号.

哪一个是正确的?

关于第二个问题,堆栈会发生什么,并为所选线程注册内容?假设线程到运行信号处理程序T正在执行do_stuff()函数.线程T的堆栈是否直接用于执行信号处理程序(即信号trampoline的地址被压入T的堆栈并且控制流程转到信号处理程序)?或者,是否使用单独的堆栈?它是如何工作的?

c linux signals signal-handling

51
推荐指数
2
解决办法
1万
查看次数

C中的函数指针和回调

我已经开始回顾回调了.我在SO上找到了这个链接: C中的"回调"是什么?它们是如何实现的? 它有一个很好的回调示例,它与我们在工作中使用的非常类似.但是,我试图让它工作,但我有很多错误.

#include <stdio.h>

/* Is the actual function pointer? */
typedef void (*event_cb_t)(const struct event *evt, void *user_data);

struct event_cb
{
    event_cb_t cb;
    void *data;
};

int event_cb_register(event_ct_t cb, void *user_data);

static void my_event_cb(const struct event *evt, void *data)
{
    /* do some stuff */
}

int main(void)
{
    event_cb_register(my_event_cb, &my_custom_data);

    struct event_cb *callback;

    callback->cb(event, callback->data);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道回调使用函数指针来存储函数的地址.但是我发现有些事情我不明白:

  • "注册回调"和"事件调度程序"是什么意思?

c pointers function callback

13
推荐指数
2
解决办法
3万
查看次数

你在C中注册一个回调函数是什么意思?

任何人都可以通过一些例子在C中注册一个回调函数来告诉我我们究竟是什么意思吗?我在网上搜索了很多,但我得不到满意的答案.甚至在堆栈溢出中搜索,但无法得到完美的想法.

什么是Notify回调和异步回调?

c callback

7
推荐指数
2
解决办法
1万
查看次数

如何在 C 中实现回调函数?

海湾合作委员会 4.4.3 c89

我正在创建一个客户端服务器应用程序,我需要实现一些回调函数。

但是,我在回调方面不太有经验。我想知道是否有人知道设计回调时可以遵循的一些好的参考材料。是否有用于 c 的设计模式?我确实看过一些模式,但那里都是 C++。

非常感谢您的任何建议,

c

5
推荐指数
1
解决办法
2996
查看次数

为什么使用回调而不是正常的函数调用?

我试图理解回调,并且确实得到了这个想法,但是不明白为什么它真的需要.

具体来说,它通过正常的函数调用提供了哪些额外的好处?我在看这里接受的答案:C中的"回调"是什么?它们是如何实现的?

我在下面重做同样的事情,只是没有使用函数指针.这有什么不同?

void populate_array(int *array, size_t arraySize)
{
   for (size_t i=0; i<arraySize; i++)
      array[i] = getNextRandomValue();
}

int getNextRandomValue(void)
{
   return rand();
}

int main(void)
{
   int myarray[10];
   populate_array(myarray, 10);
   ...
}
Run Code Online (Sandbox Code Playgroud)

如果低层软件需要调用在更高层定义的函数,这是否有益?

c function-pointers callback

3
推荐指数
1
解决办法
4042
查看次数

在C窗口等待时间没有忙等待

我有一个线程,其工作是向UDP对等体发送消息.线程发送消息iff以下适用之一:

1)自上次发送消息(如超时)以来已经过了一定时间.

2)其他线程引发了共享结构中的更新布尔标志.

我希望能够等待这些条件发生,所以我知道何时发送消息.

我能做到的最简单的方法是制作一个循环,重复直到其中一个条件满足.我担心它正在忙着等待,并且会消耗大量的CPU时间.我也不想睡觉().

我不介意使用C++解决方案,只要它易于理解和实现,因为我对C++不是很熟悉.

谢谢 !

c c++ windows

1
推荐指数
1
解决办法
1516
查看次数

回调函数的应用

我想知道callback functions实际使用的位置?

有没有办法在C/C++中实现回调函数(除了使用函数指针)?

请解释以下行 -

" A callback can be used as a simpler alternative to polymorphism and generic programming"

谢谢

c c++ polymorphism callback

0
推荐指数
1
解决办法
812
查看次数