text: #include <stdio.h> //Libreria de entrada/salida (printf,scanf...)
  #include <unistd.h> //libreria estandar de unix
  #include <sys/syscall.h> //libreria para llamadas al sistema
  #include <sys/types.h> //Libreria para crear una varibale de tipo identifiacador de proceso
  #include <signal.h> //permite trabajar con
  #include <pthread.h> //librerìa que trabaja con hilos
  #include <stdlib.h> //Libreria estandar de C
  #include <wait.h>
  #include <ctype.h>//Libreria para usar caracteres y cadenas que C trae integrado (toupper)
  #include <time.h>
  #include <semaphore.h> //Libreria para trabajar con semaforos
  #include <fcntl.h>
  #include <limits.h> //Libreria que permite saber el tamaño de un tipo de dato como long int o float y no el de una variblae concreta
  #include <sys/mman.h> //Libreria que permite crear llamadas al sistema para indicar que la variable pertenece a un espacio de memoria compartido
  #include <dirent.h>
  #include <time.h>
  
  #define STR_MAX 255
  
  void ls();
  void promt();
  //void excel();
  void comandos(char* c);
  
  char* currentDirectory[256];
  char* comandoConArg[256];
  char* argumentos[256];
  
  /**
   * Método que controla el ctrl+c
  */
  void handle_sigint(int sig)
  {
  	promt();
  }
  
  ///////////////////////////////////////////////// EMPIEZA IMPLEMENTACIÓN DE COMANDOS
  
  /**
   * Funcion que ejecuta el comando ls estandar
  */
  void ls()
  {
  
  	char my_dir[STR_MAX]; //tamaño buffer en bytes
  	struct dirent *direntp;
  	DIR *dirp;
  	getcwd(my_dir, STR_MAX);
  	
  	dirp=opendir(my_dir);
  	while((direntp=readdir(dirp))!=NULL) //printa el nombre de cada uno de los elementos del directorio, mostrando el nombre
  	{
  		printf("%s \n",direntp->d_name);
  	}
  	closedir(dirp);
  	
  }
  
  /**
   * Método que ejecuta el comando pwd, lo muestra por pantalla, y almacena en una variable la ruta
  */
  void pwd()
  {
  	
  	if (chdir("/tmp") != 0)
  		perror("chdir() error()");
  	else{
  		if(getcwd(currentDirectory, sizeof(currentDirectory)) == NULL)
  			perror("getcwd() error");
  		else
  			printf("%s\n", currentDirectory);
  	}
  }
  
  /**
   * Comando who, para saber el usuario y fecha y hora
  */
  void who()
  {
  	char user[64];
      getlogin_r(user,sizeof(user)-1); //obtengo nombre de usuario
      
  	time_t t;
  	struct tm *tm;
  	char fechayhora[100];
  
  	t=time(NULL);
  	tm=localtime(&t);
  	strftime(fechayhora, 100, "%d/%m/%Y", tm); //obtengo la fecha y hora
  	
  	printf ("%s				%s\n",user, fechayhora);
  }
  	
  /**
   * Crear un directorio en la carpeta actual
  */
  void makedir(char* nombreDir)
  {
  	
  	mkdir(strcat(currentDirectory,nombreDir));
  	
  }
  
  /**
   * Metodo para ejecutar el cd, ya sea .. o a otra ruta
  */
  void changeDir(char* c)
  {
  	
  	chdir(c); 
  	
  }
  
  /**
   * Método para eliminar un directorio
  */
  void removeDir(char* c)
  {
  	
  	rmdir(c);
  	
  }
  
  /////////////////////////////////////////////////
  /////////////////////////////////////////////////
  ///////////////////////////////////////////////// ACABA IMPLEMENTACIÓN DE COMANDOS
  /////////////////////////////////////////////////
  /////////////////////////////////////////////////
  
  /**
   * Método para mostrar el promt de la consola y capturar los comandos.
  */
  void promt()
  {
  
  	signal(SIGINT, handle_sigint);
      printf("jph_v2: ");
      char* input = (char *)malloc(101);
      scanf("%s",input);
      printf("Tu comando introducido es: %s \n", input);
      comandos(*input);
      //return input;
  
  }
  
  /**
   * Manejador de comandos, que llama al método corresondiente en funcion del comando
  */	
  void comandos(char* c)
  {
  	//ls
  	if(strcmp (c,"ls")==0 )
  	{
  		//execl("bin/ls","ls","-l",(char *)0);
  		ls();
  	}
  	
  	//pwd
  	if(strcmp(c,"pwd")==0)
  	{
  		pwd();
  	}
  	
  	/**
  	 * Comandos CON argumentos
  	*/
  	
  	//Obtener el comando cuando lleva argumentos
  	int i=0;
  	do
  	{
  		if(c[i] != " ")
  		{
  			
  			strcat(comandoConArg,c[i]);
  
  		}
  		i++;
  	} while(i<sizeof(c));
  	
  	//Obtener los argumentos
  	i++;
  	while(i<sizeof(c))
  	{
  	
  		strcat(argumentos,c[i]);
  		i++;
  		
  	}
  	
  	//mkdir
  	if(strcmp (comandoConArg,"mkdir")==0 )
  	{
  		
  		makedir(argumentos);
  		
  	}
  	
  	//cd
  	if(strcmp (comandoConArg,"cd")==0)
  	{
  		
  		changeDir(argumentos);
  		
  	}
  	
  	//rmdir
  	if(strcmp (comandoConArg,"rmdir")==0)
  	{
  		
  		removeDir(argumentos);
  		
  	}
  	
  	
  }
  
  
  /**
   * Metodo main, que llama promt
  */
  int main (void)
  {
  	
  	while(1)
  	{
  		promt();
  	}
  
  }
  