Projet Système d'Exploitation - L3 Informatique
Erraid & Tadmor est un système complet de planification de tâches (similaire à un Cron) implémenté en C pur, respectant strictement les standards POSIX.
Le projet est conçu autour d'une architecture Client-Serveur robuste utilisant des mécanismes systèmes avancés (Tubes nommés, Multiplexing I/O, Signaux, Gestion de processus) pour garantir performance et fiabilité.
- Erraid (Le Démon) : Orchestre l'exécution des tâches, gère le temps et surveille les requêtes sans attente active.
- Tadmor (Le Client) : Interface en ligne de commande (CLI) permettant aux utilisateurs de soumettre, contrôler et auditer les tâches.
Le projet ne nécessite aucune dépendance externe hormis la librairie standard C (libc).
- Un environnement Linux/Unix.
gccetmake.
Un Makefile complet est fourni pour automatiser la production.
# Compiler le projet
# Les exécutables sont générés à la racine et dans ./build/
makemake clean # Supprime les objets (.o) et le dossier build
make distclean # Supprime tout (build + exécutables racine + fichiers temporaires)Le démon doit être lancé en premier pour écouter les requêtes.
./erraid -F # Recommandé : Mode avant-plan (logs visibles dans le terminal)
# OU
./erraid & # Mode Démon (arrière-plan, logs sur disque)
# OU
./erraid -P <DIR> # Spécifier un dossier de tubes personnalisé# Tâche simple (exécutée chaque minute par défaut)
./tadmor -c echo "Bonjour"
# Tâche planifiée (Minutes, Heures, Jours 0=Dimanche)
./tadmor -m 0,30 -H 8-18 -d 1-5 -c echo "Au boulot"
# Tâche "abstraite" (jamais exécutée auto, utile pour les pipelines)
./tadmor -n -c ls -lCombine des IDs de tâches existantes (préalablement créées).
# Séquence (exécute ID 1 puis ID 2)
./tadmor -s <ID1> <ID2>
# Pipeline (stdout de ID 1 -> stdin de ID 2)
./tadmor -p <ID1> <ID2>
# Conditionnelle (SI ID1 réussit ALORS ID2 SINON ID3)
./tadmor -i <ID1> <ID2> <ID3># Lister toutes les tâches planifiées
./tadmor -l
# Voir la sortie standard (stdout) de la dernière exécution
./tadmor -o <ID>
# Voir la sortie d'erreur (stderr)
./tadmor -e <ID>
# Voir l'historique des codes de retour
./tadmor -x <ID># Supprimer une tâche spécifique
./tadmor -r <ID>
# Arrêter proprement le démon erraid (SIGTERM/Cleanup)
./tadmor -qCette section détaille les choix de conception, démontrant la maîtrise des concepts systèmes.
- IPC (Inter-Process Communication) : Utilisation de deux Tubes Nommés (Named Pipes/FIFOs) pour une communication bidirectionnelle synchrone.
- Sérialisation : Protocole binaire personnalisé "Length-Prefixed". Toutes les données (entiers, structures) sont converties en Big-Endian pour assurer la portabilité de l'architecture.
- Boucle Événementielle (Event Loop) : Utilisation de l'appel système
select(). Le serveur ne fait pas d'attente active ("busy waiting"). Il dort jusqu'à ce qu'une requête arrive ou que la prochaine minute soit atteinte. - Gestion des Processus :
- Isolation totale des tâches via
fork()etexecvp(). - Prévention des processus Zombies via
sigaction(SIGCHLD, SIG_IGN). - Mode Démon via
setsid()(détachement du terminal).
- Isolation totale des tâches via
- Redirections I/O : Utilisation de
dup2()pour capturerSTDOUTetSTDERRdes tâches et les rediriger vers des fichiers de logs.
- Bitmaps de Temps : L'horaire (minutes/heures/jours) est stocké sous forme de masques binaires (
uint64_t) pour des comparaisons bit-à-bit en temps constant O(1). - Arbres de Commandes : Structure récursive (
struct Command) permettant de représenter des commandes arbitrairement complexes (Séquences, Pipelines, Conditionnelles).
.
├── Makefile # Script de compilation automatisé
├── README.md # Documentation
├── erraid # Exécutable Serveur (généré)
├── tadmor # Exécutable Client (généré)
├── build/ # Fichiers objets intermédiaires (.o)
├── tasks/ # Persistance (Base de données des tâches sur disque)
└── src/
├── core/ # Code source (.c)
│ ├── erraid.c # Point d'entrée Serveur
│ ├── tadmor.c # Point d'entrée Client
│ ├── tache.c # Moteur d'exécution (fork/exec/pipe)
│ ├── command.c # Sérialisation et structures
│ ├── api_erraid.c # Gestionnaire de requêtes serveur
│ └── ...
└── include/ # Fichiers d'en-tête (.h)
Ce projet est distribué sous licence MIT. Vous êtes libre de l'utiliser, le modifier et le distribuer.