claww Posted November 7, 2012 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
United Posted November 12, 2012 Posted November 12, 2012 Can you just make it read from bash history. Like same as when you type "history" but use tail?
claww Posted November 12, 2012 Author 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
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now