Search code examples
clibevent

How to pass arguments to an event function created using libevent?


I'm currently trying to use libevent to call a function every n minutes / an event trigger that would call the function and was suggested that libevent can be used. I could use it persistently call the function every n seconds but was unable to figure how to pass arguments to them.

#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;
}

Solution

  • event_set is deprecated, instead, use event_new:

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

    The last parameter is an argument to be passed:

    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
    

    To schedule the execution of the event specified in event_new() use event_add(), his prototype is:

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