Question
I have a simple shell code implemented by c (in ubuntu) I need to modify it to add history feature which allows the user to
I have a simple shell code implemented by c (in ubuntu)
I need to modify it to add history feature which allows the user to access the most recently entered commands.
The user will be able to access up to 10 commands by using the feature.
The commands will be consecutively numbered starting at 1, and the numbering will continue past 10. For example, if the user has entered 35 commands, the 10 most recent commands will be numbered 26 to 35. The user will be able to list the command history by entering the command history
at the osh> prompt. As an example, assume that the history consists of the commands (from most to least recent): ps, ls -l, top, cal, who, date The command history will output: 6 ps 5 ls -l 4 top 3 cal 2 who 1 date Your program should support two techniques for retrieving commands from the command history: 1. When the user enters !!, the most recent command in the history is executed. 2. When the user enters a single ! followed by an integer N, the Nth command in the history is executed. The program should also manage basic error handling. If there are no commands in the history, entering !! should result in a message No commands in history. If there is no command
-------- The Code ---------
#include "sys/types.h" #include "sys/wait.h" #include "stdio.h" #include "unistd.h" #include "string.h" #define MAXLINE 80 /* The maximum length command */
int main(void)
{ char *args[MAXLINE/2 + 1]; /* command line arguments */ char nn[MAXLINE]; int shouldrun = 1; /* flag to determine when to exit program */ int i=0; int j;
while (shouldrun)
{ printf("OSH>"); fflush(stdout); scanf ("%[^ ]%*c", nn); printf("input:%s ",nn); i = 0; int j; args[i] = strtok(nn," ");
while (args[i] != NULL) { args[i] = strtok(NULL, " "); ++i; }
if(strcmp(args[0], "exit") == 0) break;
if(strcmp(args[i-1], "&") != 0) {
//from the book example
pid_t ID; ID = fork(); if (ID < 0) { fprintf(stderr, "Fork failed "); return 1; }
else if (ID == 0) /*child processes*/ { execvp(args[0],args); for(int j=0;j
else { wait(NULL); }
}
else { pid_t ID; ID = fork(); if(ID < 0) { fprintf(stderr,"FORK Failed "); return 1; }
else if (ID == 0) {
args[i-1] = NULL; execvp(args[0],args); } else { printf(" "); } } }
return 0;
}
-------- please help :( I tried many things but I couldn't done it
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started