Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] No funciona esta minishell hecha en C

Estas en el tema de No funciona esta minishell hecha en C en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 19/11/2015, 09:06
 
Fecha de Ingreso: mayo-2008
Mensajes: 37
Antigüedad: 16 años
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.
  #2 (permalink)  
Antiguo 19/11/2015, 09:10
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: No funciona esta minishell hecha en C

El código fuente de la librería... que se resume a una función pública no lo pones porque...

Piensa que si nos das una librería estática o usamos el mismo compilador (e incluso puede que la misma versión) o podemos tener problemas al compilar el programa.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 19/11/2015, 09:17
 
Fecha de Ingreso: mayo-2008
Mensajes: 37
Antigüedad: 16 años
Puntos: 5
Respuesta: No funciona esta minishell hecha en C

Cita:
Iniciado por eferion Ver Mensaje
El código fuente de la librería... que se resume a una función pública no lo pones porque...

Piensa que si nos das una librería estática o usamos el mismo compilador (e incluso puede que la misma versión) o podemos tener problemas al compilar el programa.

Un saludo.
Hola, ahora actualizo con el código de parser.h que supongo que es lo que dices, pero se puede descargar con el link que pongo.

Gracias

Código:
//archivo parser.h
typedef struct {
	char * filename;
	int argc;
	char ** argv;
} tcommand;

typedef struct {
	int ncommands;
	tcommand * commands;
	char * redirect_input;
	char * redirect_output;
	char * redirect_error;
	int background;
} tline;

extern tline * tokenize(char *str);
  #4 (permalink)  
Antiguo 19/11/2015, 09:20
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: No funciona esta minishell hecha en C

Cita:
Iniciado por ALBERTO802 Ver Mensaje
Hola, ahora actualizo con el código de parser.h que supongo que es lo que dices, pero se puede descargar con el link que pongo.
Me refiero a la función tokenizer
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: char, funcion, int, programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:59.