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.