#include /* incluye librerias autilizar */ #include char *args[3]; char *archivo[2]; pid_t crea_proceso() /*funcion que se encarga de crear un proceso */ { pid_t pid; /* defime nombre de la variable del proceso */ pid = fork(); /* crea un proceso */ if (pid < 0) { /* verifica que sea un proceso valido...y si no sale del programa */ perror("fork"); exit(1); } return(pid); /*retorna el numero de un nuevo proceso a quien lo haya llamado*/ } void ejecuta_proceso() /* Funcion, que se encarga de ejecutar la aplicacion deseada , en un nuevo proceso*/ { args[0] = "&"; /* carga argumento para que sea cargado en background la aplicacion */ args[1] = NULL; /* entrega a args[1] un valor NULO, para identificar el fin de argumentos */ execvp(archivo[0],args); /* funcion que ejecuta nuestra aplicacion deseada , almacenada en archivo[0]*/ perror("exec"); exit(1); } void programa(int veces) /* programa medular, es el encargado de tomar las desiciones e ir verificando los estados... */ { /* en que se encuentran cada proceso y nuevos procesos creados */ int i; /* define un entero, que sera aplicado para un for */ pid_t pid,pid2,pid_temp,ar_pid[2]; /* Se definen las variables del tipo pid_t, para el uso en la creacion de procesos */ if ((veces<9) && (veces!=6)){ /* If se encarga de verificar que se ejecute un de los procesos hijos <9 asegura que tendremos...*/ ar_pid[0]=crea_proceso(); /* un numero de 8 procesos al final de nuestra aplicacion, en esta linea crea un nuevo proceso... */ if (ar_pid[0]==0) { /* llamando a la funcion crea_proceso ..en el if se verifica que solo ingrese el proceso hijo */ ejecuta_proceso(); /* el proceso hijo ejecuta la funcion "ejecuta_proceso()", definida mas arriba */ } /* el hecho de evitar que ingrese cuando veces=6,impide que se cree un nuevo proceso al cerrar la */ } /* segunda aplicacion, guardando que para cuando se cierre la tercera aplicacion, se generen 4 */ /* aplicaciones mas */ if ((veces<8) && (veces!=6)){ ar_pid[1]=crea_proceso(); /*idem al segmento anterior, este bloque controla los procesos del segundo hijo */ if (ar_pid[1]==0) { ejecuta_proceso(); /* ejecuta el segundo proceso */ } } if (veces==5) {programa(4); } /* cuando veces==5 significa que ya se cerro la 3era aplicacion, por lo que llama aprograma, */ /* para ejecutar 2 procesos, los otros dos faltantes se cargan mas abajo, en el llamado a programa*/ pid_temp=(int)(wait((int *)0)); /* zona de espera ... en que finalizan los procesos hijos */ for(i=0;i<2;i++) if (pid_temp == ar_pid[i]); if (veces-->0) { /* el if controla que se ejecuten hasta un determinado numero de veces la aplicacion */ programa(veces); } if (veces=1) printf("\nLo siento este computador esta bajo los efectos del alcohol...\n\nHIP!\n"); /* Mensaje de disculpa */ perror("exec"); exit(1); } main (int argc,char *argv[]) { int veces=8; /*Numero clave para determinar el numero maximo de procesos a abrir */ if (argc==1){ /* Si solo se ingresa un argumento tira este mensaje */ printf("\n*******\nERROR!\nDebes ingresar lo siguiente \"./cp \"\n\n"); exit(1); } archivo[0]=*++argv; /* almacena en archivo[0], el segundo argumento ingresado por teclado */ programa(veces); /* se inicia el llamado de la funcion programa */ }