Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

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

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Spatial Databases A Tour

Authors: Shashi Shekhar, Sanjay Chawla

1st Edition

0130174807, 978-0130174802

More Books

Students also viewed these Databases questions

Question

Why is the System Build Process an iterative process?

Answered: 1 week ago