Aller au contenu principal
U/
Système
c

Shell minimal pwd, cd, ls, exit

Écrire un mini-shell C interactif qui lit des commandes sur stdin et implémente pwd, cd, ls et exit en utilisant uniquement les appels POSIX getcwd, chdir, opendir, readdir et closedir.

90 minPublié le 20 mai 2026Proposé par Anonyme

Défi

// Lisez attentivement, codez sur votre machine

Énoncé

Le programme affiche le prompt minish> sur stdout, lit une commande via fgets, supprime le \n final, puis l'interprète. Les quatre commandes supportées sont : pwd (affiche le répertoire courant via getcwd), cd <chemin> (change de répertoire via chdir ; si chdir échoue, afficher sur stderr la ligne cd: <chemin>: <message><message> est celui que strerror(errno) renvoie), ls (liste les entrées du répertoire courant via opendir/readdir/closedir, une par ligne, sans les entrées . et ..), et exit (quitte proprement avec le code 0). Une commande inconnue affiche "Commande inconnue : <cmd>" sur stderr. La boucle se termine aussi sur EOF (retour de fgets égal à NULL).

Contraintes

  • Compilé avec gcc -Wall -Wextra -std=c99 -o minish minish.c.
  • En-têtes nécessaires : <stdio.h>, <stdlib.h>, <string.h>, <unistd.h>, <dirent.h>, <errno.h>.
  • Pas de system(), popen() ni d'exécution de processus fils : tout est implémenté directement.
  • getcwd appelé avec un tampon de 1024 octets.
  • L'ordre de listage de ls suit l'ordre retourné par readdir (non trié).

Exemple

Session interactive :

minish> pwd
/home/user
minish> cd /tmp
minish> pwd
/tmp
minish> ls
systemd-private-abc
snap-private-tmp
minish> cd /inexistant
cd: /inexistant: No such file or directory
minish> exit

Fin par EOF (Ctrl+D) :

minish> 

Le programme quitte silencieusement avec le code 0.

Espace solution
// À garder en tête
  • D'abord, faire marcher

    On ne cherche pas à optimiser : d'abord, on fait marcher le truc. Optimiser vient ensuite — et ça aussi, ça s'apprend. (Si un défi porte sur l'optimisation, son énoncé le précise.)

  • Pas de mauvaise réponse

    Il n'y a pas de mauvaise réponse à un défi. Le but, c'est de le faire. Ce qui compte, c'est de s'entraîner.

  • Trop dur ? Au suivant

    Un défi te résiste ? N'hésite pas à en prendre un autre. Ils seront encore là demain.