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:
http://bit.ly/214WSCA#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; }
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.