claww Posted November 7, 2012 Share Posted November 7, 2012 Hello, i have to create a project C Shell console in linux i have it but one of requirements is to create the history, like when you press arrows up/down to show last commands used #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <signal.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <termios.h> #include <poll.h> #define MAX_LINE 80 #define BUFFER_SIZE 50 #define buffer "\n\nIstoricul comenzilor:\n" char history[10][bUFFER_SIZE]; int count = 0; int caught = 0; void printHistory() { int i; int j = 0; int hcount = count; for (i=0;i<10;i++) { printf("%d. ", hcount); while (history[i][j] != '\n' && history[i][j] != '\0') { printf("%c", history[i][j]); j++; } printf("\n"); j = 0; hcount--; if (hcount == 0) break; } printf("\n"); printf(" SHELL:~$ "); fflush(stdout); } void handle_SIGINT() { write(STDOUT_FILENO,buffer,sizeof(buffer)); printHistory(); caught = 1; } void setup(char inputBuffer[], char *args[],int *background) { int length, i, start, ct; ct = 0; length = read(STDIN_FILENO, inputBuffer, MAX_LINE); if (caught == 1) { length = read(STDIN_FILENO, inputBuffer, MAX_LINE); caught = 0; } for (i = 9;i>0; i--) strcpy(history[i], history[i-1]); strcpy(history[0],inputBuffer); count++; start = -1; if (length == 0) exit(0); if (length < 0) { perror("comanda nu poate fi citita\n"); exit(-1); } for (i=0;i<length;i++) { switch (inputBuffer[i]) { case ' ': case '\t' : if(start != -1) { args[ct] = &inputBuffer[start]; ct++; } inputBuffer[i] = '\0'; start = -1; break; case '\n': if (start != -1) { args[ct] = &inputBuffer[start]; ct++; } inputBuffer[i] = '\0'; args[ct] = NULL; break; default : if (start == -1) start = i; if (inputBuffer[i] == '&') { *background = 1; inputBuffer[i] = '\0'; } } } args[ct] = NULL; } int main(void) { char inputBuffer[MAX_LINE]; int background; char *args[MAX_LINE/+1]; unsigned char line[128]; unsigned int count = 0; int ret; pid_t pid; int i; printf(" \n\n #====================================#\n"); printf(" # Sisteme de Operare #\n"); printf(" # Linux Shell #\n"); printf(" # #\n"); printf(" #====================================#\n\n"); struct sigaction handler; handler.sa_handler = handle_SIGINT; sigaction(SIGINT, &handler, NULL); while (1) { background = 0; printf("\n SHELL:~$ "); setup(inputBuffer,args,&background); pid = fork(); if (pid < 0) { printf("Fork fail.\n"); exit (1); } else if (pid == 0) { if (execvp (args[0], args) == -1) printf("Comanda nu poate fi executata\n"); } else { if (background == 0) wait(NULL); } } } anyone can help me to implement history with key arrows to show last command used ? i have an kind on history by pressing ctrl+c is show all last used commands but is not good.. Thanks Quote Link to comment Share on other sites More sharing options...
United Posted November 12, 2012 Share Posted November 12, 2012 Can you just make it read from bash history. Like same as when you type "history" but use tail? Quote Link to comment Share on other sites More sharing options...
claww Posted November 12, 2012 Author Share Posted November 12, 2012 Can you just make it read from bash history. Like same as when you type "history" but use tail? i think require readline and i dont know how to do with it Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.