/* semplice shell che accetta comandi tipo %%cmd1 arg1 | cmd2 arg2 */ #include #include #include #include #include #define MAXLINE 128 #define MAXARGUMENTS 3 char buf[MAXLINE]; /* buffer di ingresso */ const char *cmdDelim = "|"; /* delimitatore della prima suddivisione tra cmd1 e cmd2 */ const char *argDelim = " "; /* delimitatore tra comando e tra gli argomenti */ char *cmd1; char *cmd2; char *arg1[MAXARGUMENTS+2]; /* matrice di stringhe argomenti cmd1 */ char *arg2[MAXARGUMENTS+2]; /* matrice di stringhe argomenti cmd2 */ int pipeFd[2]; pid_t pid; int status; void parsing() { int i; if(buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0'; /* cambia terminatore di linea in terminatore di stringa */ cmd1 = strtok(buf, cmdDelim); /* divide la stringa di in nella prima riga dei comandi*/ cmd2 = strtok(NULL, cmdDelim); /* ... e nella seconda riga dei comandi*/ printf("cmd1=%s cmd2=%s\n",cmd1,cmd2); if(cmd2 != NULL && *cmd2 == ' ') cmd2++; /* rimuove, se esiste, lo spazio iniziale al secondo comando */ arg1[0] = strtok(cmd1, argDelim); /* parsing degli argomenti all'interno di cmd1 */ printf("\targ1=%s \n",arg1[0]); for(i=1; i<=MAXARGUMENTS; i++) { arg1[i] = strtok(NULL, argDelim); if(arg1[i] == NULL) arg1[i] = 0; printf("\targ1=%s \n",arg1[i]); } arg1[MAXARGUMENTS+1]=NULL; if(cmd2 != NULL) { /* esiste un secondo comando? */ arg2[0] = strtok(cmd2, argDelim); /* parsing degli argomenti all'interno di cmd2 */ printf("\targ2=%s \n",arg2[0]); for(i=1; i<=MAXARGUMENTS; i++) { arg2[i] = strtok(NULL, argDelim); if(arg2[i] == NULL) arg2[i] = 0; printf("\targ2=%s \n",arg2[i]); } arg2[MAXARGUMENTS+1] = NULL; } } void main() { printf("%% "); /* prompt */ while(fgets(buf, MAXLINE, stdin) != NULL) { /* ciclo di letture da tastiera */ parsing(); pid = fork(); /* prima fork */ if(pid == 0) { /* processo generato */ pipe(pipeFd); /* creazione della pipe */ if(fork() == 0) { close(pipeFd[0]); /* chiusura della pipe in lettura */ dup2(pipeFd[1], STDOUT_FILENO); /* redirezione */ execvp(cmd1, arg1); /* esecuzione del primo comando */ } else { close(pipeFd[1]); /* chiusura della pipe in scrittura */ dup2(pipeFd[0], STDIN_FILENO); /* redirezionw */ execvp(cmd2, arg2); /* esecuzione del secondo comando */ } } else { waitpid(pid, &status, 0); /* attesa della terminazione del figlio */ printf("%% "); /* prompt */ } } }