//Ejecuta lo que hay entre tuberías
void ejecutar_orden(char *orden, int entrada, int salida , int background){
int indentrada, indsalida, pid, descriptor;
int *hijos;
int hijo = 0, estado, i;
char **array;
//printf("ejecutar_orden\n");
//parser_orden devuelve un array con la orden diseccionada. Ej. ls en la posicion 0, -l en la 1...
//También devuelve indentrada, indsalida por si hay < ó > y background 1 ó 0 si hay &
array = (char **)parser_orden(orden,&indentrada,&indsalida,&background);
//printf("indentrada %d\n",indentrada);
if (indentrada > -1) {
printf("entra en indentrada\n");
if ((descriptor = open(array[indentrada+1], O_RDONLY)) == -1) {
printf("[Error] al redireccionar la entrada\n");
exit(-1);
}
else
redirec_entrada(descriptor);
}
if (indsalida > -1) {
if ((descriptor = open(array[indentrada+1], O_WRONLY)) == -1) {
printf("[Error] al redireccionar la salida\n");
exit(-1);
}
else
redirec_salida(descriptor);
}
if (ord_interna(array) != 0) { //Si no es una orden interna, ejecuta el SO
printf("No es orden interna\n");
if ((pid = fork()) == 0) { //Es hijo
if (execvp(array[0],array) == -1) {
printf("Error al ejecutar %s\n",array[0]);
exit(-1);
}
//Almaceno los pid de los hijos para que el padre los espere
hijos[hijo] = (int)malloc(sizeof(int));
hijos[hijo] = pid;
hijo++;
}
else { //Es padre
if (background) { //No espera a los hijos
printf("[Sistema] Ejecutando en segundo plano el proceso %d...\n",pid);
if(signal(SIGCHLD,manejar_sigchild)==SIG_ERR){
perror("Error en signal SIGCHLD.\n");
exit(-1);
}
}
else { //Espera por los hijos
for (i = 0; i < hijo; i++) {
wait(&estado);
}
}
}
}
}
//Analiza la entrada a la shell
void ejecutar_linea_ordenes(const char *orden) {
char **lista_ordenes;
int **pipes;
int i = 0, total,entrada,salida,background;
//Disecciona la linea metida por teclado, con un array con las órdenes separadas según las tuberías
lista_ordenes = (char **)parser_pipes(orden, &total);
printf("total %d\n",total);
//crear_pipes crea tantas tuberías como diga total
pipes = (int **)crear_pipes(total);
while (i < total) {
printf("entra en el for\n");
entrada = 0;
salida = 0;
if (total == 1) { //No hay tubería
printf("entra en el if de total = 1\n");}
else { //Al menos hay una tubería
if (i == 0) { //Primera tubería
printf("entra en el if de i = 0\n");
salida = pipes[i][1];
//redirecciona la salida estandar
redirec_salida(salida);
}
else { //Tubería intermedia
if (i != total - 1) {
printf("entra en el if intermedio\n");
entrada = pipes[i-1][0];
salida = pipes[i][1];
//Redirecciona la entrada estandar
redirec_entrada(entrada);
redirec_salida(salida);
}
else { //Última tubería
printf("entra en el if final\n");
entrada = pipes[i-1][0];
redirec_entrada(entrada);
}
}
}
printf("antes de ejecutar_orden\n");
ejecutar_orden(lista_ordenes[i],entrada,salida,background);
i ++;
}
printf("Borrar cosas\n");
for(i=(total-1);i>=0;i--) free(lista_ordenes[i]);
free(lista_ordenes); //Liberamos memoria del vector
destruir_pipes(pipes,total); //Borramos las tuberías
}