design a c program to serve as a shell interface that accepts user commands and then executes each command in a separate process

Design a C program to serve as a shell interface that accepts user commands and then executes each command in a separate process. A shell interface gives the user a prompt, after which the next command is entered. The format of the prompt is: FirstName-L3SID>

Assuming your first name is demo and L3SID is 123, and the user’s next command is cat prog.c, so you would enter: demo-123> cat prog.c

The shell process first prints the prompt, reads what the user enters on the command line (in the above case, cat prog.c), and then creates a separate child process that performs the command. Unless otherwise specified, the shell (parent) process waits for the child to exit before printing the next prompt and continuing. However, UNIX shells typically also allow the child process to run in the background, or concurrently. To accomplish this, we add an ampersand (&) at the end of the command. Thus, if we rewrite the above command as: demo-123> cat prog.c &, the shell (parent) and child processes will run concurrently. In both cases the separate child process is created using the fork() system call, and the user’s command is executed using one of the system calls in the exec() family. For any command running in the background, the shell (parent) process does not wait for the completion of the child process; the shell prints the prompt and reads the next command immediately.

A C program that provides the general operations of a command-line shell is as follows.

#include <stdio.h>


#include <unistd.h>


#include <time.h>


#define MAXLINE 80 /* The maximum length command */

int main(void)

{

char *args[MAXLINE/2 + 1]; /* command line with max 40 arguments */

int should_run = 1; /* flag to determine when to exit program */

printf(“CS149 Shell from FirstName LastNamen”); /* replace w/ name */

while (should_run) {

printf(“FirstName-L3SID>”); /* prompt- replace FirstName and L3SID */

fflush(stdout);

/* After reading user input, the steps are:

* (1) fork a child process using fork()


* (2) the child process will invoke execvp()


* (3) if command included &, parent will NOT invoke wait()

*/

}

return 0;

}

The main() function presents the prompt and outlines the steps to be taken after input from the user has been read. The main() function continually loops as long as should_run equals 1; when the user enters exit at the prompt, your shell will set should_run to 0 and terminate.

You should modify the main() function so that a child process is forked and executes the command specified by the user. This will require parsing what the user has entered into separate tokens and storing the tokens in an array of character strings args. For example, if the user enters the command

ps –af at the prompt, the values stored in the args array are:

args[0] = “ps”

args[1] = “-af”

args[2] = NULL

This args array will be passed to the execvp() function, which has the following prototype:

execvp(char *command, char *params[]);

Here, command represents the command to be performed and params stores the parameters to this command. The execvp() function should be invoked as execvp(args[0], args). Be sure to check whether the user included an & to determine whether or not the shell (parent) process is to wait for the
child to exit.

When fork() or execvp() failed, the shell should print out error messages, output the prompt and accept the next command from user.

The shell does not need to support any additional functions such as pipe, and I/O redirection.

Compile your program with “gcc –o shell shell.c”. You can execute the program with “./shell”.

Do Not Copy From Chegg or course hero

 
Do you need a similar assignment done for you from scratch? We have qualified writers to help you. We assure you an A+ quality paper that is free from plagiarism. Order now for an Amazing Discount!
Use Discount Code "Newclient" for a 15% Discount!

NB: We do not resell papers. Upon ordering, we do an original paper exclusively for you.