Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/11/2015, 09:06
ALBERTO802
 
Fecha de Ingreso: mayo-2008
Mensajes: 37
Antigüedad: 16 años, 7 meses
Puntos: 5
No funciona esta minishell hecha en C

Hola chavales,estoy programando una minishell y no funciona adecuadamente

Hay algunas funciones que sí hace, por ejemplo, si pongo ls|ls o ls|ls|ls, saca por pantalla los archivos del directorio actual, aunque por ejemplo un ls simple no hace nada de nada. El cd también va como la mierda y no se, estoy estresado porque yo veo el código y creo que esta bien... Pero tengo mis dudas acerca de la parte de reserva de memoria con el malloc. Os agradecería mucho que le echaráis un vistazo, perdon por el tocho.



Este es el código de mi minishell, más abajo dejaré todos los archivos para que podáis ejecutarla correctamente:

Código:
#include <stdio.h>
#include <stdlib.h>
#include "parser.h"
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>

void ejecutar(char *entrada) {
	tline *line;	//Primera parte
	line = tokenize (entrada);	//Primera parte
	char *home;
	int e;
	if(strcmp(line -> commands[0].filename, "cd") == 0){
		if(line -> commands[0].argc == 1){
			home = getenv("HOME");
			e = chdir(home);
			if(e < 0){
								fprintf(stderr, "Error: %s\n", line -> commands[0].argv[0]);
			}
		}
		else{
			e = chdir(line -> commands[0].argv[1]);
			if(e < 0){
				fprintf(stderr, "Error cd: %s\n", line -> commands[0].argv[1]);
			}
		}
	}
	else{		
	
		int **p;	//Array pipes dinámico
		p = malloc(sizeof(int*) *line -> ncommands - 1);
		int i;	
		int *pidhijos;
		pidhijos = malloc(sizeof(int) *line -> ncommands);
		for(i = 0; i < line -> ncommands; i++){	//Primera parte
			for(i = 0; i < line -> ncommands - 1; i++){	//Crear pipes
			p[i] = malloc(sizeof (int)*2);
			pipe(p[1]);
		}
		for(i = 0; i < line -> ncommands - 1; i++){	//Liberar pipes
			free(p[i]);
		}
		free(p);
	
	
		int pid;	//Primera parte
		pid = fork();	//Primera parte
		if(pid < 0){	//Primera parte
			perror("fork");	//Primera parte
		}	//Primera parte
		for(i=0;i< line -> ncommands - 1;i++){
		
		pidhijos[i] = pid;
		if(pid == 0){	//Primera parte
			if(!line -> background){
				signal(SIGINT, SIG_DFL);
				signal(SIGQUIT, SIG_DFL);
				if(line -> ncommands > 1){
					if (i==0) dup2(p[0][1],1);
					else if (i==line->ncommands-1) dup2(p[i-1][0],0);
					else {
						dup2(p[i][1],1);
						dup2(p[i-1][0],0);
					}
			}
			
			for(i = 0; i < line -> ncommands - 1; i++){
				close(p[i][0]);
				close(p[i][1]);
}
			
			if(!line -> background){
				for(i = 0; i < line -> ncommands - 1; i++){
					waitpid(pidhijos[i], NULL, 0);
				}
			}
			execvp(line -> commands[i].filename, line -> commands[i].argv);	//Primera parte
			exit(EXIT_FAILURE);	//Primera parte
		}
		}	//Fin primer bucle for
		for(i = 0; i < line -> ncommands; i++){	//Primera parte
			wait(NULL);	//Primera parte		
		}	
		free(line);	//Primera parte
	}//FIN ELSE
}
}
}
int main(void){
	char buffer[1024];
	char *linea;
	
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	
		
	for(;;){
		printf("Práctica 1 - Shurshell\n");
		linea = fgets(buffer, 1024, stdin);
		if(linea == NULL)
			break;
		printf("Leído: %s\n", buffer);
		ejecutar(buffer);
	    printf("ejecutado\n");
	
	}
		return 0;
}
http://bit.ly/214WSCA

Para hacer el ejecutable hay que poner gcc minishell.c libparser_64.a -o nombredeejecutable

Muchas gracias gente espero poder devolverle al foro todo lo que me ha dado en un futuro.