Question
#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
#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
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started