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

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!