From 42dbfdd0370dc67941b11862b40272e859be59e0 Mon Sep 17 00:00:00 2001 From: David-OC17 Date: Thu, 19 Oct 2023 18:27:53 -0600 Subject: [PATCH] A01637391-homework-03 --- labs/03/simple-shell2 | Bin 0 -> 16672 bytes labs/03/simple-shell2.c | 77 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100755 labs/03/simple-shell2 create mode 100644 labs/03/simple-shell2.c diff --git a/labs/03/simple-shell2 b/labs/03/simple-shell2 new file mode 100755 index 0000000000000000000000000000000000000000..755b6ea9a8aef5247c34eec5ceeac120faa6e0cc GIT binary patch literal 16672 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 +#include +#include +#include +#include +#include +#include + +#define MAX_LINE 80 /* Maximum characters per command line */ +#define STDIN 0 +#define STDOUT 1 + +const char* Tux = + " __ \n" + " -=(o '. \n" + " '.-.\\ \n" + " /| \\\\ \n" + " '| || \n" + " _\\_):,_" ; + + +void displayTux(){ + int lengthTux = strlen(Tux); + + for (int i = 0; i < lengthTux; i++) { + if (Tux[i] == '\n') { + write(STDOUT, "\n", 1); // Print a newline character + } else { + write(STDOUT, &Tux[i], 1); // Print the character + } + } +} + +int main(void) { + char args[MAX_LINE/2 + 1]; // Buffer for user input + int should_run = 1; // Flag to control the shell loop + + while (should_run) { + displayTux(); // Print Tux at the beginnign of each line + printf(">>> "); // Prompt string + + // Read user input + fgets(args, MAX_LINE/2 + 1, stdin); // Prevents buffer overflow, and read() does not + + // Check if the user wants to exit the shell + if (strcmp(args, "exit\n") == 0) break; + + pid_t pid = fork(); // Create a child process + if (pid < 0) { + fprintf(stderr, "Error forking, errno = %d\n", errno); + return 1; + } else if (pid == 0) { // Child process + args[strlen(args) - 1] = '\0'; // Remove the newline character at the end + char* argv[MAX_LINE/2 + 1]; + char* token = strtok(args, " "); // Tokenize the input + + int i = 0; + while (token != NULL) { + argv[i] = token; + token = strtok(NULL, " "); + i++; + } + argv[i] = NULL; + + // Execute the command + if (execvp(argv[0], argv) == -1) { + perror("execvp"); // Print an error message if execvp fails + exit(EXIT_FAILURE); + } + } else { // Parent process + int status; + wait(&status); // Wait for the child process to complete + } + } + + return 0; +}