Agregando una característica de historial a mi simple shell

#include  #include  #include  #define MAX_LINE 80 /* 80 chars per line, per command, should be enough. */ /** * setup() reads in the next command line, separating it into distinct tokens * using whitespace as delimiters. It also sets the args parameter as a * null-terminated string. */ void setup(char inputBuffer[], char *args[],int *background) { int length, /* Number of characters in the command line */ i, /* Loop index for inputBuffer array */ start, /* Index where beginning of next command parameter is */ ct; /* Index of where to place the next parameter into args[] */ ct = 0; /* Read what the user enters on the command line */ length = read(STDIN_FILENO, inputBuffer, MAX_LINE); start = -1; if (length == 0) exit(0); /* ^d was entered, end of user command stream */ if (length < 0){ perror("error reading command"); exit(-1); /* terminate with error code of -1 */ } /* Examine every character in the inputBuffer */ for (i = 0; i  80 */ } int main(void) { char inputBuffer[MAX_LINE]; /* Buffer to hold the command entered */ int background; /* Equals 1 if a command is followed by '&' */ char *args[MAX_LINE/2+1];/* Command line (of 80) has max of 40 arguments */ while (1){ /* program terminates normally inside setup */ background = 0; printf("CSE2431Sh->"); fflush(0); setup(inputBuffer, args, &background); /* get next command */ int child_pid; int status; child_pid = fork(); if(child_pid == 0) { execvp(args[0],args); /* If execvp returns, it must have failed. */ printf("Execvp Failed\n"); exit(0); } else { if(background == 0) { int parent_pid; while ((parent_pid = wait(&status)) != -1 && parent_pid != child_pid) ; } else { setup(inputBuffer, args, &background); } } } } 

Estoy tratando de agregar una característica de historial al shell y no estoy seguro de cómo hacerlo. El shell debe almacenar el comando y numerar el. También debe ser capaz de recuperar los últimos 8 comandos para ejecutar de nuevo. Por ejemplo, si el usuario ha ingresado 35 comandos, 28-35 deberían poder recuperarse. El usuario debe poder ver los últimos 8 comandos escribiendo el historial y ejecutar un comando anterior escribiendo x num, donde num es el número del comando, o xr para ejecutar el más reciente.

¿Qué tal una linked list donde además almacena la longitud, el primer y el último elemento de la lista? Los elementos son los comandos de su inputBuffer .

Para su comando de historial, almacene todos los comandos ingresados ​​en una lista vinculada que limite a 8 entradas. Una vez que tienes 9 comandos enlazados, borras el más antiguo.

En el recuento de comandos puede tener una variable global o solo un int incrementado que se muestra en su indicador.

¡Espero que esto le pueda ayudar!