gpt4 book ai didi

c - libevent API : understanding the pointer parameters or return values

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:51 24 4
gpt4 key购买 nike

对于以下 libevent API:

void event_set(struct event *ev, int fd, short event, void (*cb)(int, short, void *), void *arg)

event_add(struct event *ev, const struct timeval *timeout);

struct event* event_new (struct event_base *, evutil_socket_t, short, event_callback_fn, void)

我想知道:

1) 对于第二个函数 event_add 中的指针参数 ev,函数 event_add 是否对 ev 结构进行了本地复制?

例如,如果我这样做:

  code snippet 1:

struct event ev;
event_set(&ev, ..para list 1...); // event 1
event_add(&ev, ...);
event_set(&ev, ..para list 2...); // event 2
event_add(&ev, ...);

事件1和事件2不一样是因为参数列表1和参数列表2不一样,如果event_add做本地拷贝,那么没问题,但是如果event_add不做本地拷贝,那么这两个event_add 实际上只添加事件 2?

此外,如果我有一个主要功能:

   void func(){
struct event ev;
event_set(&ev, ...);
event_add(&ev, ...)
}

int main(){
func();
event_base_dispatch(base);
}

调用 func() 后,执行返回到 main()。因为 ev 是 func() 中的局部变量。如果 event_add(&ev,...) 没有创建本地副本,那么 ev 无处可寻,就会出现问题。那么我可以在本地事件结构上调用 event_add() 吗?

我想不时添加许多定时器事件(使用像 evtimer_set 之类的东西),并且添加发生在一些回调函数中。所以我不能提前为超时事件定义全局变量,如果不能在局部变量上调用 event_add() ,有什么解决办法吗?

2) event_new 返回一个结构体指针,我想知道这个结构体在哪里,是在栈/堆内存还是静态内存?

我的特例::

        in the main.c

int main(){
struct event_base *base;
struct event pcap_ev;
..... // here I get a file descriptor pcapfd
event_set(&pcap_ev, pcapfd, EV_READ|EV_PERSIST, on_capture, pcap_handle);
event_base_set(base, &pcap_ev);
event_add(&pcap_ev, NULL);
.....
event_base_dispatch(base);
}

on_capture callback function:
void *on_capture(int pcapfd, short op, void *arg)
{
pcap_t *handle;
handle = (pcap_t *)arg;
fqueue_t* pkt_queue;

pkt_queue = init_fqueue();
pcap_dispatch(handle, -1, collect_pkt, pkt_queue); // this function put all the cached packets into pkt_queue
process_pcap(pkt_queue);
}

the sub-routine process_pcap():

void process_pcap(pkt_queue);{
for (pkt in pkt_queue){ // here is pseudo code
insert(table, pkt); // here insert the pkt into a certain table
struct event pkt_ev;
evtimer_set(&pkt_ev, timer_cb, NULL); // I want to call timer_cb after timeout
event_base_set(base, &pkt_ev);
event_add(&pkt_ev, timeout);
}
}

the callback function timer_cb():

timer_cb(...){
if(...) delete(table, pkt);
.......
}

我只是担心 timer_cb() 不会被调用,因为 pkt_ev 是一个局部变量。

最佳答案

您必须使用不同的 struct event您想要了解的每个事件的实例。您只能调用event_add()在本地 struct event变量,如果该变量的生命周期跨越所有对事件循环 API 的调用,直到它被 event_del() 删除。 .

分配函数默认为堆,但您可以用event_set_mem_functions() 替换您自己的分配例程。 .

关于c - libevent API : understanding the pointer parameters or return values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16680633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com