Alors voilà je dois développer un mini Interpreteur de commande en C a remettre très prochainement.
J'ai écrit les différentes fonctions et le programme principale se compile mais ne remplis pas sa fonction première.

Je ne vois pas d'où viens le problèmes

En espérant que vous pourrez me debloquer et m'aider.

Voici mon code source :

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
 
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
 
#include <sys/wait.h> 
#include <ctype.h>     
#include <string.h>
#include <errno.h> 
 
 
 
// Variable global contenant les commandes entrées par l'utilisateur
char saisie[2048];
char prompt[25];
char *parametres[200];
pid_t pid;
 
 
//Affiche le prompt ">"
void affiche_invite()
{
  printf("[%s]$ ",prompt);
 
  fflush(stdout); //Vidage du buffer
}
 
void lectureClavier()
{
	scanf("%[^\n]",saisie);
	getchar();
}
 
void attent(pid_t pid)
{
  /* il faut boucler car waitpid peut retourner avec une erreur non fatale */
  while (1) {
    int status;
    int r = waitpid(pid,&status,0); /* attente bloquante */
    if (r<0) { 
      if (errno==EINTR) continue; /* interrompu => on recommence à attendre */
      printf("%s\n",strerror(errno));
      break;
    }
    if (WIFEXITED(status))
      printf("terminaison normale, status %i\n",WEXITSTATUS(status));
    if (WIFSIGNALED(status))
      printf("terminaison par signal %i\n",WTERMSIG(status));
    break;
  }
}
void executer()
{  
    if (pid!=0)
      pid=fork();
    if (pid ==0)
    execvp(parametres[0],parametres);
 
}
 
int analyse_ligne(char saisie[200],char * parametre[200])
{
int i=0,j,k,debut,fin;
int taille=strlen(saisie);
int np=0;
 
while (i<taille)
{
	debut=i;
	while(saisie[i] != ' ' && (i<taille))
		{i++;}
	fin=i;
 
	parametre[np]=calloc((fin-debut)+1,sizeof(char));
 
	int l=0;
	for(k=debut;k<fin;k++)
	{
		parametre[np][l]=saisie[k];
		l++;
	}
	parametre[np][l]='\0';
	np++;
	while(saisie[i] == ' ' && (i<taille))
		{i++;}
 
}
 
parametre[np]=NULL;
 
 
 
}
 
 
 
 
 
 
int main()
{
  int fin;
  int tube[1];
  int np=0;
 
  printf("nom prompt:\n");
  scanf("%[^\n]",prompt);
  getchar();
  printf("\n");
  while (1)
  {
 
  affiche_invite();
  lectureClavier();
  analyse_ligne(saisie,parametres);
  if(strcmp(parametres[np-1],'&') ==0)
    {
    pipe(tube);
 
    if(fork==0)
    {
  	 dup2(tube[1],STDOUT_FILENO);
  	 executer();
    }
   else
     {
      executer();
      attent(pid);
    }
  }
}
 
 
 
return 0;
}