Skip to content

libevent

Messaging & StreamingNetworking / Event-drivenC

What it is

libevent is a high-performance C library that provides asynchronous event notification. It allows applications to execute callbacks when file descriptors, signals, or timers become active, enabling scalable network servers and event-driven programs.

libevent allows registering events for file descriptors, signals, and timers, and associates callbacks with those events. It supports event loops that wait for multiple events simultaneously, making it ideal for network servers, asynchronous I/O, and real-time applications.

Installation

sudo apt install libevent-dev

Getting started

The smallest useful thing you can do with it, and what each part means.

Simple timer event
#include <event2/event.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void timer_cb(evutil_socket_t fd, short what, void *arg) {
    printf("Timer fired!\n");
}

int main() {
    struct event_base *base = event_base_new();
    struct event *timer_event;
    struct timeval one_sec = {1, 0};

    timer_event = event_new(base, -1, EV_PERSIST, timer_cb, NULL);
    event_add(timer_event, &one_sec);

    event_base_dispatch(base);

    event_free(timer_event);
    event_base_free(base);
    return 0;
}
Creates a persistent timer event that fires every second using libevent.
File descriptor event
// Monitor a socket or stdin for read/write readiness and call a callback when data is available.

Advanced usage

Where the library earns its place over a simpler alternative.

Signal handling
// Register signals like SIGINT to perform graceful shutdowns using evsignal_new() and event_add().
HTTP server with libevent
// Use libevent’s evhttp API to create lightweight HTTP servers handling requests asynchronously.
Integrating multiple events
// Combine timers, I/O, and signals in a single event loop for scalable applications.

Errors and fixes

The failures you are most likely to hit, and what actually resolves them.

event_base_new failed
Check system resources; ensure that the library is properly installed.
event_add failed
Verify valid event parameters and non-conflicting resources.
Segmentation fault in callback
Ensure callback functions handle data correctly and buffers are valid.

Best practices

  • Use the provided event loop for all asynchronous operations.
  • Avoid blocking calls inside callbacks to maintain responsiveness.
  • Use EV_PERSIST for repeating events instead of manually re-adding events.
  • Properly free events and the event base to avoid memory leaks.
  • Leverage evhttp or bufferevent for easier network programming.

Background

Why it exists, and what it was reacting to.

libevent was created by Niels Provos in 2000 to simplify the development of high-performance network applications. It abstracts the underlying OS event notification mechanisms (like epoll, kqueue, and select), making it portable and efficient across platforms.