libuv pour C++ : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

libuv pour C++ : Guide complet de l'entrée-sortie asynchrone

Bienvenue dans ce guide exhaustif sur la bibliothèque libuv pour le langage C++. Cet article, conçu pour le portail éducatif PythonLib, s'adresse aux développeurs souhaitant maîtriser la programmation asynchrone en C++ avec l'une des bibliothèques les plus fiables et performantes.

1. Qu'est-ce que libuv et pourquoi l'utiliser ?

libuv est une bibliothèque multiplateforme en langage C, dédiée aux entrées-sorties (I/O) asynchrones. Initialement développée pour le projet Node.js, elle permet d'abstraire la gestion de la boucle d'événements (event loop) et des opérations d'E/S non bloquantes sur différents systèmes d'exploitation. Aujourd'hui, libuv est utilisée non seulement dans Node.js, mais aussi dans des projets comme Julia, Luvit, Pyuv (Python) et bien d'autres.

Pourquoi l'utiliser ? En programmation moderne, il est souvent nécessaire d'exécuter plusieurs tâches simultanément sans bloquer le thread principal. Les approches traditionnelles, comme le multithreading, sont complexes à implémenter et sujettes à des erreurs (conditions de concurrence, interblocages). libuv propose une alternative élégante : un modèle asynchrone basé sur une boucle d'événements. Vous enregistrez des gestionnaires (callbacks) pour différents événements (lecture socket, minuteur, signal), et libuv les appelle automatiquement lorsque l'événement se produit, sans bloquer l'exécution d'autres tâches.

Pour les développeurs C++, libuv offre un outil puissant pour créer des serveurs réseau haute performance, des clients, des outils de gestion de fichiers et des utilitaires système. Elle gère tout le travail bas niveau avec epoll (Linux), kqueue (macOS), IOCP (Windows) et autres mécanismes, en fournissant une API unique et simple. Cela permet d'écrire du code fonctionnant sur n'importe quelle plateforme sans modification.

2. Installation de libuv

L'installation de libuv dépend de votre système d'exploitation et du gestionnaire de paquets utilisé. Comme libuv est une bibliothèque C, elle ne s'installe pas via pip, npm ou cargo. Voici les principales méthodes d'installation :

Linux (Ubuntu/Debian)

sudo apt update
sudo apt install libuv1-dev

macOS (Homebrew)

brew install libuv

Windows (vcpkg)

vcpkg install libuv

Compilation depuis les sources (pour toutes les plateformes)

git clone https://github.com/libuv/libuv.git
cd libuv
mkdir build && cd build
cmake .. -DBUILD_TESTING=OFF
make -j$(nproc)
sudo make install

Après l'installation, vous pouvez compiler votre programme en liant la bibliothèque :

g++ -std=c++11 -o mon_programme mon_programme.cpp -luv

3. Démarrage rapide : Exemple minimal fonctionnel

Écrivons un programme simple qui crée une boucle d'événements et lance un minuteur qui se déclenche une fois après 1 seconde.

#include <uv.h>
#include <cstdio>

// Callback pour le minuteur
void on_timer(uv_timer_t* handle) {
    printf("Le minuteur a sonné !\n");
    // Arrête la boucle d'événements
    uv_stop(handle->loop);
}

int main() {
    // 1. Crée la boucle d'événements
    uv_loop_t* loop = uv_default_loop();

    // 2. Crée et initialise le minuteur
    uv_timer_t timer;
    uv_timer_init(loop, &timer);

    // 3. Lance le minuteur : se déclenche une fois après 1000 ms
    uv_timer_start(&timer, on_timer, 1000, 0);

    // 4. Lance la boucle d'événements
    printf("Démarrage de la boucle d'événements...\n");
    uv_run(loop, UV_RUN_DEFAULT);

    // 5. Nettoie les ressources
    uv_loop_close(loop);

    return 0;
}

Explication :

  1. uv_default_loop() — récupère la boucle d'événements globale par défaut.
  2. uv_timer_init() — initialise la structure du minuteur.
  3. uv_timer_start() — démarre le minuteur avec un délai de 1000 ms et un intervalle de 0 (une seule exécution).
  4. uv_run() — exécute la boucle d'événements jusqu'à ce qu'elle soit arrêtée.
  5. uv_stop() — arrête la boucle d'événements depuis le callback.
  6. uv_loop_close() — libère les ressources associées à la boucle.

Recommendations