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
| #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_SAIS 50
#define TRUE 1
void prompt();
int lecture(char * cmd,char ** params);
char * cmd;
char ** params;
void clean_stdin(void){
int c;
do{
c=getchar();
} while(c!='\n' && c!=EOF);
}
int main(){
int statut;
int i=0;
int nbp;
pid_t child_pid;
while (TRUE){
params=malloc(10*sizeof(char*));
// printf("alloue params : %p\n",params);
cmd=malloc(MAX_SAIS*sizeof(char));
// printf("alloue cmd : %p\n",cmd);
prompt();
nbp=lecture(cmd,params);
child_pid=fork();
if (child_pid !=0){
printf("%d\t%d\n",getpid(),child_pid);
waitpid(-1,&statut,0);
}
else {
printf("exécute : %d\n",getpid());
execvp(cmd,params);
printf("%s n'est pas un programme\n",cmd);
i=-1;
do {
i++;
// printf("%s\t",params[i]);
}while(params[i]!=NULL);
// printf("\n");
}
i=nbp;
do{
// printf("libère %p : %s\n",*(params+i),*(params+i));
free(*(params+i));
// printf("libéré param %d\n",i);
i--;
}while(i>=0);
// printf("libère NULL : %p\n",*(params+i));
// free(*(params+i));
// printf("libéré\n");
// printf("Libère cmd : %p\n",cmd);
free(cmd);
// printf("libéré\n");
// printf("libère params : %p\n",params);
free(params);
// printf("libéré\n");
i=0;
clean_stdin();
}
}
void prompt(){
printf("MiKaShEll>> ");
}
int lecture(char * cmd, char ** params){
int i=0;
int j=0;
int k=0;
char tmp[MAX_SAIS];
scanf("%[^\n]",tmp);
// printf("%s\n",tmp);
*(params+j)=malloc(MAX_SAIS*sizeof(char));
// printf("params[%d] alloué %p\n",j,*(params+j));
while((tmp[i]!='\0')&&(tmp[i]!='\n')&&(tmp[i]!=' ')&&(i<MAX_SAIS)){
*(cmd+i)=*(tmp+i);
*(*(params+j)+i)=*(tmp+i);
i++;
}
*(cmd+i)='\0';
*(*(params+j)+i)='\0';
// printf("params[%d]:\t%s\n",j,*(params+j));
k=0;
j++;
if (*(tmp+i)==' ') i++;
while((tmp[i]!='\0')&&(tmp[i]!='\n')&&(i<MAX_SAIS)){
*(params+j)=malloc(MAX_SAIS*sizeof(char));
// printf("params[%d] alloué %p\n",j,*(params+j));
while((tmp[i]!='\0')&&(tmp[i]!='\n')&&(tmp[i]!=' ')&&(i<MAX_SAIS)){
*(*(params+j)+k)=*(tmp+i);
// printf("%d\t%c\t%c\n",k,*(tmp+i),*(*(params+j)+k));
i++;
k++;
}
*(*(params+j)+k)='\0';
// printf("params[%d]:\t%s\n",j,*(params+j));
if (tmp[i]=='\n') break;
i++;
j++;
k=0;
}
*(params+j)=malloc(MAX_SAIS*sizeof(char));
*(params+j)=NULL;
// printf("params[%d]:\t%s\n",j,*(params+j));
return (j);
} |