Question
***************************************************************************//** @file MyShell.c @author xxx *******************************************************************************/ /** DO NOT change the existing function definitions. You can add functions, if necessary. */ /** @brief Fork a
***************************************************************************//** @file MyShell.c @author xxx
*******************************************************************************/
/** DO NOT change the existing function definitions. You can add functions, if necessary. */
/** @brief Fork a child to execute the command using execvp. The parent should wait for the child to terminate @param args Null terminated list of arguments (including program). @return returns 1, to continue execution and 0 to terminate the MyShell prompt. */ int execute(char **args) {
}
/** @brief gets the input from the prompt and splits it into tokens. Prepares the arguments for execvp @return returns char** args to be used by execvp */ char** parse(void) {
}
/** @brief Main function should run infinitely until terminated manually using CTRL+C or typing in the exit command It should call the parse() and execute() functions @param argc Argument count. @param argv Argument vector. @return status code */ int main(int argc, char **argv) {
return EXIT_SUCCESS; }
The file MyShell.c is already given to you. The file contains the functions shown in the below table. You should NOT change the method signatures. You should implement the missing portions of the program as per the guidelines given below, which is firmly required. You may add additional functions if necessary. int main(int argc, char** argv) - The main function should display the MyShell> prompt. You should not change the name of the prompt. - The main function should indefinitely run until terminated by CTRL+C or when the user types the exit command in the My.Shell> prompt. - It should call the parse() function in order to accept and process the command the user enters - It should call the execute() function to actually execute the command char** parse(void) - Gets the input typed by the user in the MyShell> prompt in the form of a line - Splits the line into tokens - The tokens are used to create a char** pointer which will serve as an argument for execvp int execute(char** args) - char** args is obtained from the parse function - You should fork a child and execute the command typed in by the user using EXECVP. You should only use execvp and not other versions. - When fork fails, an error message should be printed. However, the next MyShell> prompt should be shown. - When execvp is not successful, an error message should be printed, and the child should terminate. However, the next MyShell > prompt should be shown. - When an empty command is entered, the next MyShell> prompt should be shown. - When the command exit is entered by the user, the main program must exit [You may or may not fork in order to implement the exit command]. - The parent should wait for the child to terminate before it accepts another command. You can use wait or waitpid for this. Other guidelines or useful hints: - User command plus arguments will not exceed 255 characters - Each command may have different number of arguments. We assume it will not exceed 255 arguments - Variables stored in Stack cannot be accessed outside of a function/procedure, while data dynamically allocated in Heap can be accessed by any function within one program. - Only one command should be typed at the MyShell> prompt, no pipelining of commands - Commands run in MyShell> will assume the user's original path: Type "echo \$PATH" to see the current path variable setting. Myshell is not responsible for finding the path for the commands or files. - If the user makes a mistake typing a command and/or its arguments, execvp should simply fail to run the command. A simple error should be shown, but next MyShell> prompt should be displayed. - Please note that complicated commands like "cd" may not work as shown in the sample output. - If execvp was not successful (e.g., a wrong command), remember to 'exit( (0) ' the child process. - The best command to test different cases is 'echo', for which you can give different numbers of characters and arguments. What you should submit: A single, completed file MyShell.c to canvas. Note: make sure it is compliable for Juhua using gec 9.3.0. Sample Output: Grading Rubric This assignment will be scored out of 100 points. (100/100)=100% 110 points are possible. External Correctness: - MyShell > is displayed correctly 5 - MyShell> accepts user input 5 - MyShell > is displayed after executing a command 10 - MyShell > is displayed after execvp fails 5 - MyShell > is not displayed after the exit command 5 - The command user types are executed 10 - The command user types are executed, and the results are displayed 10 - When the user types an empty command, no error message is printed and the next MyShell > prompt is displayed 10 - When the user types exit the program terminates 10 - When the user presses CTRL +C, the program terminates 10 Internal Correctness: - The execvp command is appropriately implemented with the correct arguments 5 - After fork, the parent waits for the child to terminate 5 - The user input is parsed and tokenized to suit the execvp arguments 5 - There is code to display MyShell> prompt infinitely, except when exit command or CTRL+C is given 5 Warning: - Automatic deduction of 10 points, if provided functions are not implemented as the guidelinesStep 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