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
| #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_SAIS 50
#define TRUE 1
void prompt();
void 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;
pid_t child_pid;
while (TRUE){
params=(char**)malloc(10);
printf("alloue params : %p\n",params);
cmd=(char*)malloc(MAX_SAIS);
printf("alloue cmd : %p\n",cmd);
prompt();
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",cmd);
i=-1;
do {
i++;
printf("%s\t",params[i]);
}while(params[i]!=NULL);
printf("\n");
}
i=0;
do{
printf("libère %p : %s\n",*(params+i),*(params+i));
free(*(params+i));
printf("libéré\n");
i++;
}while(*(params+i)!=NULL);
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>> ");
}
void 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)=(char*)malloc(MAX_SAIS);
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';
k=0;
j++;
if (*(tmp+i)==' ') i++;
while((tmp[i]!='\0')&&(tmp[i]!='\n')&&(i<MAX_SAIS)){
*(params+j)=(char*)malloc(MAX_SAIS);
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);
i++;
k++;
}
*(*(params+j)+i)='\0';
printf("params[%d]:\t%s\n",j,*(params+j));
if (tmp[i]=='\n') break;
i++;
j++;
k=0;
}
*(params+j)=(char*)malloc(MAX_SAIS);
*(params+j)=NULL;
printf("params[%d]:\t%s\n",j,*(params+j));
} |
Partager