ESCUELA POLITÉCNICA NACIONAL              CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                 ...
ESCUELA POLITÉCNICA NACIONAL            CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                   ...
ESCUELA POLITÉCNICA NACIONAL           CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                    ...
ESCUELA POLITÉCNICA NACIONAL             CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                  ...
ESCUELA POLITÉCNICA NACIONAL             CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                  ...
ESCUELA POLITÉCNICA NACIONAL           CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                    ...
ESCUELA POLITÉCNICA NACIONAL           CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                    ...
ESCUELA POLITÉCNICA NACIONAL           CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                    ...
ESCUELA POLITÉCNICA NACIONAL          CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                     ...
ESCUELA POLITÉCNICA NACIONAL            CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                   ...
ESCUELA POLITÉCNICA NACIONAL            CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                   ...
ESCUELA POLITÉCNICA NACIONALCARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                       SISTEMAS...
ESCUELA POLITÉCNICA NACIONALCARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN                       SISTEMAS...
Upcoming SlideShare
Loading in …5
×

Informe minishell

293 views
212 views

Published on

Minishell desarrollada en c,

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
293
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Informe minishell

  1. 1. ESCUELA POLITÉCNICA NACIONAL CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchao INFORMEPrograma para una mini Shell#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>#include<sys/wait.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<errno.h>#include<sys/mman.h>#include<pthread.h>#include<semaphore.h>#include<sys/file.h>#include<time.h>#include<sys/ipc.h>#include<sys/sem.h>#include<sys/times.h>#include<sys/time.h>#include<unistd.h>externint fork();externint pipe();/* Define constante nominada*/#define PROMPT "veroshell@vero-linux:$ "#define ESPACIO #define TUBERIA |#define ENTRADA <#define SALIDA >#define ERROR "&>"#define VARIABLE =#define EXIT e#define INGRESO i#define DOLAR $#define BACKGROUND &#define MAX_BUF 1024#define MAX_COMMS 32#define MAX_ARGS 32#define TAMANYO_ALM 1024#define TB 1024#define ESPERA 1000char buf[TB];char *bp;int lver=0, larchivo=1, i, lineas=0, desplazamiento=0;int archivo,bytesleidos;int arrange (char *buffer) {int i = 0, j = 0;while (buffer[i]) {
  2. 2. ESCUELA POLITÉCNICA NACIONAL CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchaowhile (buffer[i] == ESPACIO) i++;while ((buffer[i] != ESPACIO) && buffer[i]) buffer[j++] = buffer[i++];if (! buffer[i]) {if (buffer[i-2] == ESPACIO) buffer[j-2] = 0;else buffer[j-1] = 0; }else buffer[j++] = ESPACIO; }return j;}int makeargs (char * buffer, char * args[]) {int i = 0;char * puntero = buffer;args[i++] = puntero;while (puntero = strchr(puntero, ESPACIO)) { *puntero++ = 0; args[i++] = puntero;} args[i] = NULL;return i;}int environment (char * buffer, char * env[]) {char *puntero = buffer;if (puntero = strchr(puntero, INGRESO)) { *puntero++ = 0; env[0] = buffer;env[1] = puntero;return 1; }return 0;}int background (char * buffer) {char *puntero = buffer;if (puntero = strchr(puntero, BACKGROUND)) { *puntero--;*puntero = 0;return 1; }return 0;}int main( int argc, char *argv[] ) { int continuar; int ingreso;#ifdef DEBUGint i;#endifchar buffer[MAX_BUF], *puntero, value[MAX_BUF], *args[MAX_ARGS],*comms[MAX_COMMS];int j = 0, k = 0, pid = 0, numargs = 0, actual = 0, anterior = 0, t1[2],t2[2]; printf("nMinishell de sistemas Operativos"); printf("nn");
  3. 3. ESCUELA POLITÉCNICA NACIONAL CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchao do{ printf(PROMPT); printf("n MENU"); printf("n 1. Procesos en abanico"); printf("n 2. Semaforos"); printf("n 3. Creacion de archivos"); printf("n 4. Copia de un archivo a otro"); printf("n 5. Vector usando lseek"); printf("n 6. Comando tail"); printf("n 7. Pipes"); printf("n 8. Tuberias"); printf("n 9. Hora del sistema"); printf("n 10. Tiempo en modo usuario"); printf("n 11. Comandos"); printf("n Ingrese la opcion a realizar: "); scanf("%i",&ingreso);if(ingreso==11){while(1) { printf(PROMPT);if (fgets(buffer, MAX_BUF, stdin) == NULL)continue; arrange(buffer);#ifdef DEBUG printf("Entrada: #%s#n", buffer); i = 0;#endifif (environment(buffer, args)) {//setenv(args[0], args[1], 1); = exit(0); }elseif (background(buffer)) {if (fork() == 0) { pid = fork(); if (pid) { wait(NULL); printf("Proceso terminado con PID=%dn", pid); printf(PROMPT); exit(0); } else { execlp(buffer, buffer, NULL); perror("Error de ejecucion de execvpn"); exit(0); } } }elseif (fork()) wait(NULL);else { numargs = makeargs(buffer, args);while (args[j] != NULL) {#ifdef DEBUG printf(" #%s#n", args[j]); #endif
  4. 4. ESCUELA POLITÉCNICA NACIONAL CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchao if (args[j][0] == DOLAR) { strcpy(value, getenv(++args[j])); args[j] = value; } if (*args[j] == |) { args[j] = NULL; anterior = actual; actual = j+1; pipe(t1); #ifdef DEBUG printf("t1[0] = %d, t1[1] = %dn", t1[0], t1[1]); printf("t2[0] = %d, t2[1] = %dn", t2[0], t2[1]); printf("Anterior %dn", anterior); printf("Actual %dn", actual); #endif if (fork() == 0) { if (anterior != 0) { close(t1[0]); close(t2[1]); close(0); dup(t2[0]); close(1); dup(t1[1]); close(t1[1]); close(t2[0]); } else { close(t1[0]); close(1); dup(t1[1]); close(t1[1]); } execvp(args[anterior], &args[anterior]); perror("Error de execvpn"); exit(0); } else wait(NULL); t2[0] = t1[0]; t2[1] = t1[1]; } j++; }#ifdef DEBUG printf("t1[0] = %d, t1[1] = %dn", t1[0], t1[1]); printf("t2[0] = %d, t2[1] = %dn", t2[0], t2[1]);#endif close(t2[1]); close(0); dup(t2[0]); close(t2[0]);#ifdef DEBUG printf("actual %dn", actual);#endif execvp(args[actual], &args[actual]);perror("Error de execvpn");exit(0); }}}elseif(ingreso==1){ pid_t pid;int i;
  5. 5. ESCUELA POLITÉCNICA NACIONAL CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchaoint n = 4; printf ("nA partir de un proceso padre se crea un abanico deprocesosn");for (i = 0; i < n; i++) { pid = fork();if (pid == 0)break; } printf("El padre del proceso %d es %dn", getpid(), getppid()); exit(0);}elseif(ingreso==2){ int pid_p; /* identifica el proceso hijo */ int mutex; /* semaforo binario */ mutex=inicia(1); if (0==(pid_p=fork())) proceso_hijo(mutex); else proceso_padre(mutex); borra_s(mutex);}elseif(ingreso==3){ int fd_archivo; int escrito=0; int aux=0; int longitud=5; char datos[]="Prueba"; fd_archivo=creat("Ejemplo",0644); if(fd_archivo==-1) { perror("Archivo no creado"); } else printf("Archivo creado"); while(escrito<longitud) { aux=write(fd_archivo, datos+escrito, longitud-escrito); if(aux>0) escrito=escrito+aux;}close(fd_archivo);}elseif(ingreso==4){ int fd_ent, fd_sal; /* identificadores de archivos */ char almacen[TAMANYO_ALM]; /* almacen de E/S */ int n_read; /* contador de E/S */ /* Abrir el archivo de entrada */ fd_ent = open ("Ejemplo", O_RDONLY); if (fd_ent < 0)
  6. 6. ESCUELA POLITÉCNICA NACIONAL CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchao { perror ("open"); exit (-1); } /* Crear el archivo de salida. Modo de protección: rw-r--r--*/ fd_sal = creat ("archivo_salida", 0644); if (fd_sal < 0) { perror ("creat"); exit (-1); } /* Bucle de lectura y escritura */ while ((n_read = read (fd_ent, almacen, TAMANYO_ALM)) >0 ) { if (write (fd_sal, almacen, n_read) < n_read) { perror ("write"); close (fd_ent); close (fd_sal); exit (-1); } } if (n_read < 0) { perror ("read"); close (fd_ent); close (fd_sal); exit (-1); } printf("El archivo copiado correctamente en archivo_salida"); close (fd_ent); close (fd_sal);}elseif(ingreso==5){ int fd_archivo; int numero; int longitud=10; char datos1[]="ABCDEFGHIJ"; char datos2[]="abcdefghij"; fd_archivo=creat("Vectores",0644); if(fd_archivo==-1) { perror("No se Puede Crear el Archivo"); } write(fd_archivo, datos1, longitud); numero= lseek(fd_archivo, 1024,SEEK_SET); write(fd_archivo, datos2, longitud); numero=lseek(fd_archivo, numero+1024,SEEK_SET); write(fd_archivo, datos1, longitud); printf("Archivo escrito con los vectores correctamente");close(fd_archivo);
  7. 7. ESCUELA POLITÉCNICA NACIONAL CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchao}elseif(ingreso==6){ archivo=open("Leer", O_RDONLY); while(bytesleidos = read(archivo, buf, TB))//Cuento cuantas lineastiene mi archivo { for(i=0; i<= 1024; i++) { if(buf[i] == n) larchivo++; } if(bytesleidos == -1) break; } close(archivo); printf ("nComando tailn nn"); printf("lineas para ver:"); scanf("%d",&lver); if(lver >= larchivo) lver = 0; else{ while(bytesleidos = read(archivo,buf, 1024)) { for(i=0; i <= 1024; i++) { if(buf[i] != n) desplazamiento++; else{ desplazamiento++; lineas++; } if(lineas == larchivo - lver - 1) break; } if(bytesleidos == -1) break; } close(archivo); } archivo = open("Leer", O_RDONLY); lseek(archivo, desplazamiento, SEEK_SET); while(bytesleidos = read(archivo, buf, TB)) { if(bytesleidos == -1) break; write(0, buf, bytesleidos); } close(archivo); printf("n");}elseif(ingreso==7){ int fd[2]; char mensaje[] = "nMensaje enviado a hijo por Veron";
  8. 8. ESCUELA POLITÉCNICA NACIONAL CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchao char buffer[40]; pipe(fd); pid_t hijo; if((hijo = fork())<0) { perror("No se puede crear el proceson"); exit(1); } if(hijo!= 0) { close(fd[0]); write(fd[1],mensaje,strlen(mensaje)); } else { close(fd[1]); read(fd[0],buffer,sizeof(buffer)); printf("nLo que se envio por el pipe es: %s",buffer); } return(0);}elseif(ingreso==8){ int fd1[2];pid_t pid;/* se crea la tuberia */if (pipe(fd1) < 0) { perror("Error al crear la tuberia");exit(0); } pid = fork();switch (pid) {case -1: /* error */ perror("Error en el fork"); exit(0);case 0: /* proceso hijo ejecuta ls */close(fd1[0]); close(STDOUT_FILENO); dup(fd1[1]); close(fd1[1]); execlp("ls", "ls", NULL);perror("Error en el exec");break;default: /* proceso padre ejecuta wc */close(fd1[1]); close(STDIN_FILENO); dup(fd1[0]); close(fd1[0]); execlp("wc", "wc", NULL);perror("Error en el exec");}}elseif(ingreso==9){ time_t tiempo; struct tm *fecha;
  9. 9. ESCUELA POLITÉCNICA NACIONAL CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchao tiempo= time(NULL); fecha= localtime(&tiempo); /* hay que ajustar el año ya que lo devuelve respecto a 1900 */ printf ("%02d/%02d/%04d %02d:%02d:%02dn", fecha->tm_mday, fecha->tm_mon, fecha->tm_year+1900, fecha->tm_hour, fecha->tm_min, fecha->tm_sec);}elseif (ingreso==10){ struct tms InfoInicio, InfoFin; clock_t t_inicio, t_fin; long tickporseg; if (argc<2) { fprintf(stderr, "Uso: %s programa [args]n", argv[0]); exit(1); } tickporseg= sysconf(_SC_CLK_TCK); t_inicio= times(&InfoInicio); if (fork()==0) { execvp(argv[1], &argv[1]); perror("error ejecutando el programa"); exit(1); } wait(NULL); t_fin= times(&InfoFin); printf ("Tiempo real: %7.2fn", (float)(t_fin - t_inicio)/tickporseg); printf ("Tiempo de usuario: %7.2fn", (float)(InfoFin.tms_cutime -InfoInicio.tms_cutime)/tickporseg); printf ("Tiempo de sistema: %7.2fn", (float)(InfoFin.tms_cstime -InfoInicio.tms_cstime)/tickporseg);}printf("n Desea continuar: 1 0n");scanf("%d", &continuar);}//dowhile(continuar==1);}proceso_hijo(critica)int critica;{ int i,j; for (i=0;i< 5; i++) { P(critica); printf("Soy el proceso Hijo en el turno %d", i);
  10. 10. ESCUELA POLITÉCNICA NACIONAL CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchao fflush(stdout); //Limpia el buffer de teclado retardo (); printf("n"); V(critica); } exit(1);}proceso_padre(critica)int critica;{ int i,j; for (i=0;i< 5; i++) { P(critica); printf("Soy el proceso Padre en el turno %d", i); fflush (stdout); //Limpia el buffer de teclado retardo (); printf("n"); V(critica); } wait(0); /* espera a que finalice el hijo */}retardo(){ struct timeval tiempo; struct timezone tz; unsignedlong inicio, ahora; gettimeofday(&tiempo, &tz); ahora = inicio = tiempo.tv_sec * 1000000 + tiempo.tv_usec; // ESPERA microsegs while (ahora < inicio + ESPERA) { gettimeofday(&tiempo, &tz); ahora = tiempo.tv_sec * 1000000 + tiempo.tv_usec; }}inicia(valor)int valor;{ int semval; int id; union semun { int val; struct semid_ds *buf; ushort *array; } arg; //Permisos del semaforo creado if ((id=semget(IPC_PRIVATE, 1, (IPC_CREAT|0666))) == -1) {
  11. 11. ESCUELA POLITÉCNICA NACIONAL CARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchao perror("Error al crear semaforo."); return(-1); } arg.val = valor; if (semctl(id, 0, SETVAL, arg) == -1) { perror("Error al inicializar semaforo."); return (-1); /*error en inicializacion*/ } return(id);}/*Rutina P */P(semaforo)int semaforo;{ if ( semcall(semaforo, -1) == -1 ) perror("Error");}/*Rutina V */V(semaforo)int semaforo;{ if ( semcall(semaforo, 1) == -1 ) perror("Error");}semcall(semaforo, operacion)int semaforo, operacion;{ struct sembuf sb; sb.sem_num = 0; sb.sem_op = operacion; sb.sem_flg = 0; return ( semop(semaforo, &sb, 1) ); /*devuelve -1 si error */}borra_s(semaforo)int semaforo;{ if ( semctl(semaforo, 0, IPC_RMID, 0) == -1) { perror("Error"); return(-1); }}CAPTURAS:
  12. 12. ESCUELA POLITÉCNICA NACIONALCARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchao
  13. 13. ESCUELA POLITÉCNICA NACIONALCARRERA DE INGENIERÍA EN SISTEMAS INFORMÁTICAS Y DE COMPUTACIÓN SISTEMAS OPERATIVOS NOMBRE: Alexander Pinchao

×