Как передать аргументы функции события, созданной с помощью libevent?

В настоящее время я пытаюсь использовать libevent для вызова функции каждые n минут/триггер события, который будет вызывать функцию, и было предложено использовать libevent. Я мог бы использовать его, чтобы постоянно вызывать функцию каждые n секунд, но не мог понять, как передавать им аргументы.

#include <stdio.h>
#include <sys/time.h>
#include <event.h>

void say_hello(int fd, short event, void *arg)
{
  printf("Hello\n");
  // printf("%d", (int *)arg[0])
}

int main(int argc, const char* argv[])
{
  struct event ev;
  struct timeval tv;

  tv.tv_sec = 3;
  tv.tv_usec = 0;

  event_init();
  // event_set(&my_event, 0, EV_PERSIST, my_function, NULL);
  event_set(&ev, 0, EV_PERSIST, say_hello, NULL);
  // evtimer_set(&ev, say_hello, NULL);
  evtimer_add(&ev, &tv);
  event_dispatch();

  return 0;
}

person jogan    schedule 07.09.2019    source источник
comment
Вероятно, это NULL в event_set, который вы можете использовать для передачи любого адреса, а затем вернуть его к правильному типу указателя в say_hello.   -  person Piotr Skotnicki    schedule 07.09.2019
comment
event_set()? Я не знаком с функцией libevent с таким именем... Вы имели в виду event_new()? Если да, то это аргумент callback_arg. Я также не вижу event_init() или event_dispatch()...   -  person Shawn    schedule 07.09.2019
comment
@PiotrSkotnicki Я не знаю, как и где их передать. Я не мог понять, как передать что-либо ему. Пытался передать его в NULL, но выдает кучу ошибок.   -  person jogan    schedule 07.09.2019
comment
event_set(&ev, 0, EV_PERSIST, say_hello, argv[0]);, затем printf("%s", (const char *)arg);   -  person Piotr Skotnicki    schedule 07.09.2019


Ответы (1)


event_set устарел, вместо этого используйте event_new:

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

Последний параметр — это передаваемый аргумент:

Parameters
    base    the event base to which the event should be attached.
    fd  the file descriptor or signal to be monitored, or -1.
    events  desired events to monitor: bitfield of EV_READ, EV_WRITE, EV_SIGNAL, EV_PERSIST, EV_ET.
    callback    callback function to be invoked when the event occurs
    callback_arg    an argument to be passed to the callback function

Чтобы запланировать выполнение события, указанного в event_new(), используйте event_add(), его прототип:

int event_add(
    struct event *ev,
    const struct timeval *timeout
)   
person David Ranieri    schedule 07.09.2019