Advertisement
EBobkunov

ex4.2

Oct 1st, 2023 (edited)
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.86 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6. #include <string.h>
  7.  
  8. #define MAX_INPUT_SIZE 1024
  9.  
  10. int main() {
  11.     char input[MAX_INPUT_SIZE];
  12.     char current_dir[MAX_INPUT_SIZE];
  13.  
  14.     while (1) {
  15.         printf("%s> ", getcwd(current_dir, sizeof(current_dir)));
  16.  
  17.         fgets(input, MAX_INPUT_SIZE, stdin);
  18.  
  19.         // Remove newline character
  20.         input[strlen(input) - 1] = '\0';
  21.  
  22.         if (strcmp(input, "exit") == 0) {
  23.             printf("Exiting MyShell...\n");
  24.             break;
  25.         } else if (strncmp(input, "cd ", 3) == 0) {
  26.             // Handle cd command
  27.             char *path = input + 3; // Skip "cd " prefix
  28.  
  29.             if (strcmp(path, "..") == 0) {
  30.                 // Handle "cd .."
  31.                 if (chdir("..") != 0) {
  32.                     perror("chdir");
  33.                 }
  34.             } else {
  35.                 // Handle "cd folder"
  36.                 if (chdir(path) != 0) {
  37.                     perror("chdir");
  38.                 }
  39.             }
  40.  
  41.             continue;
  42.         }
  43.  
  44.         pid_t child_pid = fork();
  45.  
  46.         if (child_pid == -1) {
  47.             perror("fork");
  48.             return 1;
  49.         } else if (child_pid == 0) {
  50.             // Child process
  51.  
  52.             // Tokenize the input into arguments
  53.             char *args[MAX_INPUT_SIZE / 2];
  54.             int arg_count = 0;
  55.  
  56.             char *token = strtok(input, " ");
  57.             while (token != NULL) {
  58.                 args[arg_count] = token;
  59.                 arg_count++;
  60.                 token = strtok(NULL, " ");
  61.             }
  62.  
  63.             args[arg_count] = NULL;
  64.  
  65.             // Execute the command in the background
  66.             if (execvp(args[0], args) == -1) {
  67.                 perror("execvp");
  68.                 exit(1);
  69.             }
  70.         }
  71.     }
  72.  
  73.     return 0;
  74. }
  75.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement