Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

#include #include #include #include #include #define MAX_CMD_LENGTH 1024 #define MAX_ARGS 64 char error_message[30] = An error has occurred ; int parse_input(char* input, char** args) {

#include #include #include #include #include

#define MAX_CMD_LENGTH 1024 #define MAX_ARGS 64

char error_message[30] = "An error has occurred ";

int parse_input(char* input, char** args) { int i = 0; char* token = strtok(input, " \t "); while (token != NULL) { args[i++] = token; token = strtok(NULL, " \t "); } args[i] = NULL; return i; }

int execute_cmd(char** args, char** path, int num_paths) { pid_t pid = fork(); if (pid == -1) { write(STDERR_FILENO, error_message, strlen(error_message)); return 1; } else if (pid == 0) { // child process int i; for (i = 0; i < num_paths; i++) { char cmd[MAX_CMD_LENGTH]; snprintf(cmd, sizeof(cmd), "%s/%s", path[i], args[0]); execv(cmd, args); } // if we reach here, execv failed write(STDERR_FILENO, error_message, strlen(error_message)); exit(1); } else { // parent process int status; waitpid(pid, &status, 0); return WEXITSTATUS(status); } }

int main(int argc, char** argv) { // initialize path with /bin char* path[2] = {"/bin", NULL}; int num_paths = 1; // check if we're in batch mode FILE* input_file = NULL; if (argc > 2) { write(STDERR_FILENO, error_message, strlen(error_message)); return 1; } else if (argc == 2) { input_file = fopen(argv[1], "r"); if (input_file == NULL) { write(STDERR_FILENO, error_message, strlen(error_message)); return 1; } } // main loop char* line = NULL; size_t line_size = 0; ssize_t line_len; while (1) { // prompt for input if (input_file == NULL) { printf("wish> "); fflush(stdout); } // read input line_len = getline(&line, &line_size, input_file != NULL ? input_file : stdin); if (line_len == -1) { // end of file or error break; } else if (line_len == 1) { // empty line continue; } else if (strncmp(line, "exit", 4) == 0) { // exit command break; } else { // parse input char* args[MAX_ARGS]; int num_args = parse_input(line, args); // execute command int ret = execute_cmd(args, path, num_paths); if (ret != 0) { printf("Command returned with error code %d ", ret); } // check for exit command if (strcmp(args[0], "exit") == 0) { break; } } // free memory free(line); line = NULL; line_size = 0; } if (input_file != NULL) { fclose(input_file); } return 0; }

Can you implement these instructions in this code?

1. Parallel Commands Your shell will also allow the user to launch parallel commands. This is accomplished with the ampersand operator as follows: wish> cmd1 & cmd2 args1 args2 & cmd3 args1

In this case, instead of running cmd1 and then waiting for it to finish, your shell should run cmd1, cmd2, and cmd3 (each with whatever arguments the user has passed to it) in parallel, before waiting for any of them to complete.

2. built in command

In this project, you should implement exit, cd, and path as built-in commands. this code needs cd command, exit and path are already implemented

Thanks

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_2

Step: 3

blur-text-image_3

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

Graph Databases New Opportunities For Connected Data

Authors: Ian Robinson, Jim Webber, Emil Eifrem

2nd Edition

1491930896, 978-1491930892

More Books

Students also viewed these Databases questions