![]() |
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.
|
|
google unix.com
|
|||||||
| Forums | Register | Forum Rules | Links | Albums | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here. |
More UNIX and Linux Forum Topics You Might Find Helpful
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| A simple query on unix shell script | shekhar_ssm | Shell Programming and Scripting | 2 | 01-23-2008 11:41 AM |
| unix command history | mm00123 | SUN Solaris | 3 | 12-03-2007 07:13 AM |
| creating file of 1MB using shell command? | vijaya2006 | Shell Programming and Scripting | 4 | 04-04-2006 07:47 AM |
| how unix stores command history | Sabari Nath S | UNIX for Advanced & Expert Users | 3 | 09-10-2005 12:52 AM |
| Simple UNIX Shell Script help, PLEASE | ci2a020 | UNIX for Dummies Questions & Answers | 1 | 08-02-2001 04:43 PM |
|
|
LinkBack | Thread Tools | Search this Thread | Rate Thread | Display Modes |
|
||||
|
Creating a command history feature in a simple UNIX shell using C
I'm trying to write a history feature to a very simple UNIX shell that will list the last 10 commands used when control-c is pressed. A user can then run a previous command by typing r x, where x is the first letter of the command. I'm having quite a bit of trouble figuring out what I need to do, I have very little C experience, but I know a fair bit of C++. If anyone could give me some suggestions as to where to start, I'd appreciate it. Here is the code I'm working from right now.
#include <stdio.h> #include <signal.h> #include <sys/types.h> #include <unistd.h> #define MAX_LINE 80 /* 80 chars per line, per command */ #define BUFFER_SIZE 50 char buffer[BUFFER_SIZE]; /* the signal handling function */ void handle_SIGINT() { write(STDOUT_FILENO, buffer, strlen(buffer)); } /** * setup() reads in the next command line, separating it into distinct tokens * using whitespace as delimiters. setup() sets the args parameter as a * null-terminated string. */ void setup(char inputBuffer[], char *args[],int *background) { int length, /* # of characters in the command line */ i, /* loop index for accessing 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 the command"); exit(-1); /* terminate with error code of -1 */ } /* examine every character in the inputBuffer */ for (i=0;i<length;i++) { switch (inputBuffer[i]){ case ' ': case '\t' : /* argument separators */ if(start != -1){ args[ct] = &inputBuffer[start]; /* set up pointer */ ct++; } inputBuffer[i] = '\0'; /* add a null char; make a C string */ start = -1; break; case '\n': /* should be the final char examined */ if (start != -1){ args[ct] = &inputBuffer[start]; ct++; } inputBuffer[i] = '\0'; args[ct] = NULL; /* no more arguments to this command */ break; default : /* some other character */ if (start == -1) start = i; if (inputBuffer[i] == '&'){ *background = 1; inputBuffer[i] = '\0'; } } } args[ct] = NULL; /* just in case the input line was > 80 */ } int main() { 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]; pid_t pid; /* set up the signal handler */ struct sigaction handler; handler.sa_handler = handle_SIGINT; sigaction(SIGINT, &handler, NULL); while (1){ /* Program terminates normally inside setup */ background = 0; printf(" sh>\n"); setup(inputBuffer,args,&background); /* get next command */ /* the steps are: (1) fork a child process using fork() */ pid = fork(); if(pid == 0){ /* child process (2) the child process will invoke execvp()*/ execvp(args[0], args); exit(0); } else if(pid > 0){ /*parent process (3) if background == 1, the parent will wait, otherwise returns to the setup() function. */ if(background == 1){ wait(NULL); }/* if */ }/* if */ } } |
| Bookmarks |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|