Bonjour tout le monde. J'ai un petit problème avec une condition de mon programme. C'est un petit programme qui simule un Shell Linux . Juste un petit problème qui me chiffonne c'est lorsqu'on tape la commande "exit" dans le programme il ne sort du programme que si la commande exit est entrée après une commande Linux valide. j'ai tourné en rond pendant des heures mais je ne trouve pas... si quelqu'un aurait une piste de solution voici mon code.

Code complet:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
//Bibliothèques
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
 
// Variables globales
int sec = 0, pid_parent = 0; //sec comptabilise les secondes, pid_parent le process ID
 
void timer() //Fonction qui va comptabiliser les secondes et couper au bout de 60 secondes
{
    sec++;
    if(sec == 60)
    {
        kill(pid_parent, 3);
    }
    else //si les secondes atteignent 60 on tue le processus sinon on augmente de 1 seconde
    {
        alarm(1);
    }
}
 
int main()
{
int i = 0, bool = 1;
char afficherShell[100] = {"SHELL >"}; //Shell d'origine
char commandeSortie[100] = {"exit"}; //Contient la commande de sortie
char commandeTapee[100] = {""}; //Contient la commande tapée par l'utilisateur
 
// Bloc pour gerer le temps si l'utilisateur reste inactif
void (*pointeur)(); //Déclaration du pointeur pour la fonction de timer
pointeur = &timer; //Mise de l'adresse de la fonction dans le pointeur
signal(SIGALRM,pointeur);
alarm(1);
// Fin du bloc
 
while (bool == 1) //tant que Bool est egal à un on va faire tourner le programme
{
// Bloc d'affichage du Shell
printf("%s", afficherShell); //Affichage du Shell
gets(commandeTapee); //Récupération de la commande tapée
//Fin du bloc d'affichage du Shell
 
//Bloc qui va gérer le cas ou l'utilisateur entre le mot exit
if(strcmp(commandeTapee, commandeSortie) == 0)
{
    bool = 0; //Mise à zero de bool et sortie de la boucle
}
//Fin du bloc de la gestion de la sortie
 
printf("Derniere commande tapee: %s\n",commandeTapee); //Affichage de la dernière commande tapée
 
//Bloc qui va gérer si l'utilisateur entre un Prompt
    if (strstr(commandeTapee, "prompt"))
    {
       for (i=0; i<92; i++)
        {
          afficherShell[i] = commandeTapee[i+7]; //Supression de "prompt" ainsi que l'espace pour récupérer le nouveau shell.
        }
    }
//Fin du bloc prompt
 
//Bloc qui va executer les commandes Linux
    else
    {
    int i =0,pos = 0, bool2 = 0, pid = 0, status =0, erreur = 0,execution_possible = 0;
    char param[100], ligne[100],bin[100] = {"/bin/"};
 
 
    strcpy (ligne,commandeTapee); // On va copier la commande entree dans ligne
 
    for (i = 0; i < 100; i++)
    {
 
        if (ligne[i] == ' ') //Si la ligne entree contient un espace on va recuperer les arguments
        {
            pos = i;
 
            for (i =pos; i < 100; i++)
            {
            ligne[pos] = ligne[i];
            }
 
            for (i =pos; i < 100; i++)
            {
            param[i-pos-1] = ligne[i];
            }
            bool2 = 1; //ici on met bool2 à 1  pour executer l'exec avec les paramètres
        }
 
    }
 
    if(fork()) //Si fork on attend la fin
    {
        pid=wait(&status);
    }
    else
    {
        if (bool2 == 1) //Dans le cas ou l'on gère des paramètres
        {
            erreur = execlp(ligne, ligne, param,NULL);
                if (erreur == -1) //Si la commande execlp retourne une erreur on affiche le message d'erreur
                {
                printf("Ce n'est pas une commande Linux valide!\n");
                erreur = 0;
                }
                strcat( bin, ligne);
                execution_possible = access(bin, 1);
                if(execution_possible == -1)
                {
                printf("La commande n'est pas dans le /bin !\n");
                }
        }
        else //Dans le cas ou l'on n'utilise pas de paramètres
        {
            erreur = execlp(ligne, ligne, NULL);
            if (erreur == -1)
            {
            printf("Ce n'est pas une commande Linux valide\n");
            erreur = 0;
            }
                strcat( bin, ligne);
                execution_possible = access(bin, 1);
                if(execution_possible == -1)
                {
                printf("La commande n'est pas dans le /bin !\n");
                }
        }
 
    }
 
    }
//Fin du bloc de gestion des commandes
 
if(strcmp(commandeTapee, commandeSortie) == 0)
{
    bool = 0;
}
 
}
return 0;
}
Merci d'avance de vos réponses