Question

In: Computer Science

Building a Command Line Interpreter (myshell) 1.Goal of this programming assignment The primary goal of this...

Building a Command Line Interpreter (myshell)

1.Goal of this programming assignment

The primary goal of this assignment is to understand and gain some familiarity with

the system call interface in Unix Environment. In this assignment you will be

implementing your own command line interpreter like a Unix shell program.

YOU ARE NOT IMPLEMENTING COMMANDS!

YOUR program should just

FORK off programs and EXECUTE them.

2.

Requirements

(1)

Programming language: You have to use either C or C++ to develop your program.

(2)

Running Environment: Your program should be compiled at

CSEGRIDand be able tobe tested without errors.

3.

The implementation details

(1)

Backgrounds: The command line interpreter, called a shell, is an application program

that gets commands from a keyboard and uses the system call interfaces to invoke OS

functions.

(2)

Your shell should support followings:

(a)

Support exit or stop

your shell command

a)

Example(s): exit

(b)

Support commands with no arguments

.

a)

Examples: “ls”, “pwd”, “whoami” and “hostname”

(c)

Support commands with arguments:

a)

Examples: “ls –l”, “ls –fx”, “ps –aux” ,“date –u”, “cd directory”, etc.

(d)

A command, with or without arguments, whose output is redirected to a file

a)

Examples: ls > foo, ls -Fx > foob

(e)

A command, with or without arguments, whose input is redirected from a file

a)

Examples: sort < testfile

(f)

Supporting a sequence of programs that communicate through a pipe.

a)

Examples: ls | wc

(g)

Display error messages if the typed command has errors or can’t be found

2

4.

Hint

Your shell should isolate itself from program failures by creating a child process to

execute each command specified by the user. For example, the “tar cvf cli5678 program1”

command is executed by a child of the process executing the shell, myshell.

% tar cvf cli5678 program1

You might consider the following functions to build myshell:

(1)

Printing a prompt – when myshell is begun, it display its own string as its own prompt.

For example, “myshell> ”.

(2)

Getting command line –

To get a command line, the shell performs a blocking read

operation so that the process that executes the shell will be blocked until the user types

a command line in response to the prompt. When the user enters the command, the

comm

and line string should be returned to the myshell.

(3)

Parsing the command: Take the user command and divide it into command and

arguments as well as checking errors.

(4)

Finding the file – The shell provides a set of “environment variables” for each user

such as “PATH”. The PATH environment variable is an ordered list of absolute

pathnames that specifies where the shell should search for command files.

(5)

Create a child process and launch the command –

Once the command and arguments

are prepared, create a child process to execute the command with its arguments and

wait until the command is completed.

Someone help to solve this Operating Systems problem?

Solutions

Expert Solution

PROGRAM:

CODE:

int main(int argc, char **argv)
{
lsh_loop();

return EXIT_SUCCESS;
}

void lsh_loop(void)
{
char *lines;
char **args;
int status;

do {
printf("> ");
lines = lsh_read_lines();
args = lsh_split_lines(lines);
status = lsh_execute(args);

free(lines);
free(args);
} while (status);
}


#define LSH_RL_BUFF_SIZE 1024
char *lsh_read_lines(void)
{
int Buff_Size = LSH_RL_BUFF_SIZE;
int pos = 0;
char *buff = malloc(sizeof(char) * Buff_Size);
int c;

if (!buff) {
fprintf(stderr, "lsh: allocation error\n");
exit(EXIT_FAILURE);
}

while (1) {
c = getchar();
if (c == EOF || c == '\n') {
buff[pos] = '\0';
return buff;
} else {
buff[pos] = c;
}
pos++;
if (pos >= Buff_Size) {
Buff_Size += LSH_RL_BUFF_SIZE;
buff = realloc(buff, Buff_Size);
if (!buff) {
fprintf(stderr, "lsh: allocation error\n");
exit(EXIT_FAILURE);
}
}
}
}

char *read_lines_lsh(void)
{
char *lines = NULL;
ssize_t Buff_Size = 0;
getlines(&lines, &Buff_Size, stdin);
return lines;
}

#define BUFF_SIZE_TOKEN_LSH 64
#define DELIM_TOKEN_LSH " \t\r\n\a"
char **lsh_split_lines(char *lines)
{
int Buff_Size = BUFF_SIZE_TOKEN_LSH, pos = 0;
char **tokens = malloc(Buff_Size * sizeof(char*));
char *token;

if (!tokens) {
fprintf(stderr, "lsh: allocation error\n");
exit(EXIT_FAILURE);
}

token = strtok(lines, DELIM_TOKEN_LSH);
while (token != NULL) {
tokens[pos] = token;
pos++;

if (pos >= Buff_Size) {
Buff_Size += BUFF_SIZE_TOKEN_LSH;
tokens = realloc(tokens, Buff_Size * sizeof(char*));
if (!tokens) {
fprintf(stderr, "lsh: allocation error\n");
exit(EXIT_FAILURE);
}
}

token = strtok(NULL, DELIM_TOKEN_LSH);
}
tokens[pos] = NULL;
return tokens;
}

int launch_LSH(char **args)
{
pid_t pid, wpid;
int status;

pid = fork();
if (pid == 0) {
if (execvp(args[0], args) == -1) {
perror("lsh");
}
exit(EXIT_FAILURE);
} else if (pid < 0) {
perror("lsh");
} else {
do {
wpid = waitpid(pid, &status, WUNTRACED);
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
}

return 1;
}

int lsh_cd(char **args);
int lsh_help(char **args);
int lsh_exit(char **args);

char *bullitin_str[] = {
"cd",
"help",
"exit"
};

int (*builtin_func[]) (char **) = {
&lsh_cd,
&lsh_help,
&lsh_exit
};

int lsh_num_builtins() {
return sizeof(bullitin_str) / sizeof(char *);
}

int lsh_cd(char **args)
{
if (args[1] == NULL) {
fprintf(stderr, "lsh: expected argument to \"cd\"\n");
} else {
if (chdir(args[1]) != 0) {
perror("lsh");
}
}
return 1;
}

int lsh_help(char **args)
{
int i;
printf("Stephen Brennan's LSH\n");
printf("Type program names and arguments, and hit enter.\n");
printf("The following are built in:\n");

for (i = 0; i < lsh_num_builtins(); i++) {
printf(" %s\n", bullitin_str[i]);
}

printf("Use the man command for information on other programs.\n");
return 1;
}

int lsh_exit(char **args)
{
return 0;
}

int lsh_execute(char **args)
{
int i;

if (args[0] == NULL) {
return 1;
}

for (i = 0; i < lsh_num_builtins(); i++) {
if (strcmp(args[0], bullitin_str[i]) == 0) {
return (*builtin_func[i])(args);
}
}

return launch_LSH(args);
}


#include <sys/wait.h>
waitpid() and associated macros
#include <unistd.h>
chdir()
fork()
exec()
pid_t
#include <stdlib.h>
malloc()
realloc()
free()
exit()
execvp()
EXIT_SUCCESS, EXIT_FAILURE
#include <stdio.h>
fprintf()
printf()
stderr
getchar()
perror()
#include <string.h>
strcmp()
strtok()


Related Solutions

1. INTRODUCTION The goal of this programming assignment is for students to write a Python program...
1. INTRODUCTION The goal of this programming assignment is for students to write a Python program that uses repetition (i.e. “loops”) and decision structures to solve a problem. 2. PROBLEM DEFINITION  Write a Python program that performs simple math operations. It will present the user with a menu and prompt the user for an option to be selected, such as: (1) addition (2) subtraction (3) multiplication (4) division (5) quit Please select an option (1 – 5) from the...
Here are the tasks for this assignment: 1. Write a bash command line to determine if...
Here are the tasks for this assignment: 1. Write a bash command line to determine if the server 'syccuxfs01.pcc.edu' is reachable from the syccuxas01.pcc.edu server. 2. As you have read, TCP/IP messages are passed from one device to another until the message reaches its destination. Write a bash command line that will verify that no more than two (2) network devices are used to pass messages from the syccuxas01.pcc.edu server to the www.pcc.edu server. 3. Write a bash command line...
What is the primary goal in using a scripting language for programming work?
What is the primary goal in using a scripting language for programming work?
Turtle Command Interpreter You will write a program that reads a sequence of codes, converts them...
Turtle Command Interpreter You will write a program that reads a sequence of codes, converts them into Turtle commands, and then executes them. The codes are in a Python list, passed as an argument to your function. turtleRunner(t, x) t is a Turtle x is a list of Turtle commands Code List (f, d)    Move forward by d pixels u Lift pen up d Put pen down (l, d) Turn left by d degrees (r, d) Turn right by...
I have written code in C programming that checks where the command line arguments are floats...
I have written code in C programming that checks where the command line arguments are floats or not. For example, if I type "./math 1 1 0 0 2.5 3" in the terminal, my program realizes they are all floats but if I type "./math 1 1 0 0 2.5 g", it recognizes that not all arguments are floats and gives an error message. I want to take my code further such that after typing in "./math 1 1 0...
1. What command is used to change the current working directory at the command line?
1. What command is used to change the current working directory at the command line?
For this assignment, you will create a command-line version of the game ​Hangman. You should work...
For this assignment, you will create a command-line version of the game ​Hangman. You should work in a group of two on the project and not view Hangman code of other students or found on-line. Submit this project-- your .java file-- here on Canvas. For this assignment you will research on StringBuilder Class (​Use this link​) and use it in your code. Functional requirements (rubric) ● Your game should have a list of at least ten phrases of your choosing...
What is the primary goal of capitalism? What is the primary goal of socialism?
What is the primary goal of capitalism? What is the primary goal of socialism? What do you think are the pros and cons of each?
c++ Programming For this assignment you will be building on your Fraction class. However, the changes...
c++ Programming For this assignment you will be building on your Fraction class. However, the changes will be significant, so I would recommend starting from scratch and using your previous version as a resource when appropriate. You'll continue working on your Fraction class for one more week, next week. For this week you are not required to provide documentation and not required to simplify Fractions. Please keep all of your code in one file for this week. We will separate...
How do I add additional command line arguments in C++? I am working on a programming...
How do I add additional command line arguments in C++? I am working on a programming assignment that has the user input a file into the command line and then they have the option to also add a series of other arguments to the command line. I know how to accept the text file from the command line by using: int main(int argc, char *argv[]) { /.../ } Then filename(argv[1]) would be the text file that they put into the...
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT