Advertisement
EBobkunov

ex4

Oct 1st, 2023 (edited)
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.82 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.  
  13.     while (1) {
  14.         printf("MyShell> ");
  15.         fgets(input, MAX_INPUT_SIZE, stdin);
  16.  
  17.         // Remove newline character
  18.         input[strlen(input) - 1] = '\0';
  19.  
  20.         if (strcmp(input, "exit") == 0) {
  21.             printf("Exiting MyShell...\n");
  22.             break;
  23.         }
  24.  
  25.         pid_t child_pid = fork();
  26.  
  27.         if (child_pid == -1) {
  28.             perror("fork");
  29.             return 1;
  30.         } else if (child_pid == 0) {
  31.             // Child process
  32.  
  33.             // Tokenize the input into arguments
  34.             char *args[MAX_INPUT_SIZE / 2];
  35.             int arg_count = 0;
  36.  
  37.             char *token = strtok(input, " ");
  38.             while (token != NULL) {
  39.                 args[arg_count] = token;
  40.                 arg_count++;
  41.                 token = strtok(NULL, " ");
  42.             }
  43.  
  44.             args[arg_count] = NULL;
  45.  
  46.             // Check if the last argument is "&" for running in the background
  47.             int run_in_background = 0;
  48.             if (arg_count > 0 && strcmp(args[arg_count - 1], "&") == 0) {
  49.                 run_in_background = 1;
  50.                 args[arg_count - 1] = NULL; // Remove the "&" from arguments
  51.             }
  52.  
  53.             // Execute the command
  54.             if (execvp(args[0], args) == -1) {
  55.                 perror("execvp");
  56.                 exit(1);
  57.             }
  58.         } else {
  59.             // Parent process
  60.  
  61.             // If not running in the background, wait for the child to finish
  62.             if (strcmp(input, "") != 0 && input[strlen(input) - 1] != '&') {
  63.                 wait(NULL);
  64.             }
  65.         }
  66.     }
  67.  
  68.     return 0;
  69. }
  70.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement