#include #include #include #include #include #include #include #define MAX_ARGS 10 int main(void) { int flag = 1, status; // Déclare des variables pour contrôler la boucle et stocker le statut des processus fils. ssize_t get; size_t buf = 0; pid_t pid; char *args[MAX_ARGS]; // Tableau de pointeurs vers les arguments de la commande. char *input = NULL; // Chaîne pour stocker l'entrée de l'utilisateur. int arg_count = 0; // Compteur pour le nombre d'arguments. char *token; int i; signal(SIGINT, SIG_IGN); // Ignore le signal SIGINT (Ctrl+C) pour empêcher la fermeture involontaire du shell. do { write(STDOUT_FILENO, "$ ", 2); // Affiche le prompt. // Lecture de la ligne d'entrée de l'utilisateur. get = getline(&input, &buf, stdin); if (get == -1) { free(input); exit(0); } input[strcspn(input, "\n")] = '\0'; // Supprime le caractère de nouvelle ligne. arg_count = 0; for (i = 0; i < MAX_ARGS; i++) { args[i] = NULL; // Initialise le tableau des arguments à NULL. } token = strtok(input, " \t\n"); // Découpe la ligne en tokens (mots) en utilisant les espaces, tabulations et sauts de ligne comme délimiteurs. while (token != NULL && arg_count < MAX_ARGS - 1) { args[arg_count] = strdup(token); // Copie le token dans le tableau des arguments. arg_count++; token = strtok(NULL, " \t\n"); // Passe au token suivant. } args[arg_count] = NULL; // Marque la fin des arguments avec NULL. if (arg_count > 0) { pid = fork(); // Crée un processus fils. if (pid < 0) { perror("fork a échoué !"); exit(1); } else if (pid == 0) { // Code exécuté par le processus fils. execvp(args[0], args); // Exécute le programme spécifié par le premier argument avec les arguments donnés. perror("execvp a échoué !"); exit(1); } else { // Code exécuté par le processus parent. waitpid(pid, &status, 0); // Attend la fin du processus fils. if (WIFEXITED(status) && WEXITSTATUS(status) != 0) { fprintf(stderr, "%s: commande introuvable\n", args[0]); } } } for (i = 0; i < arg_count; i++) { free(args[i]); // Libère la mémoire allouée pour chaque argument. } } while (flag == 1); free(input); // Libère la mémoire allouée pour l'entrée. return 0; }