IO redirection in C shellPlease implement input output redirect.pdf

19 views 7 slides Jul 08, 2023
Slide 1
Slide 1 of 7
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7

About This Presentation

I/O redirection in C shell
Please implement input / output redirection in the code posted below. Here are the specs:
Your shell will need to support file redirection. Use the same syntax as defined in the Bash shell:
a single \'>\' implies that one needs to redirect the standard output of...


Slide Content

I/O redirection in C shell
Please implement input / output redirection in the code posted below. Here are the specs:
Your shell will need to support file redirection. Use the same syntax as defined in the Bash shell:
a single \'>\' implies that one needs to redirect the standard output of the program being started to
the referenced file while a single \'<\' implies the same with standard input. The double \'>>\'
implies that standard output will append to an existing file rather than create a new file (similar
behavior is required for the \'<<\' operator and standard input). You do not need to implement
support for the Bash pipeline operator \'|\'.
Before calling exec to begin execution, the child process may have to close stdin (file desriptor
0) and/or stdout (file descriptor 0), open the corresponding file and use the dup2 system call to
make it the appropriate file descriptor. Don\'t forget to use the close system call to close the old
file descriptor.
#include
#include
#include
#include
#include
#include
using namespace std;
int change_dir(char* args[])
{
   if (args[1] == NULL)
   {
       chdir(getenv(\"HOME\"));
       return 1;
   }

   else
   {
       if (chdir(args[1]) == -1)
       {
           cout << \"No such directory\" << args[1];
           return -1;
       }
   }

   return 0;
}
int helper_func(char* args[])
{
   cout << \"Builtin commands so far are; cd, and help. \";

   return 0;
}
int main()
{
   while(true)
   {
       cout << \"$ \";
       char cmd[128];
       cin.getline(cmd,128);

       vector args;
       char *line = strtok(cmd, \" \");
       char *tmp = line;
       while (tmp != NULL)
       {
           args.push_back(tmp);
           tmp = strtok(NULL, \" \");
       }

       char** argv = new char*[args.size() + 1];
       for (int i = 0; i < args.size(); i++)
           argv[i] = args[i];

       argv[args.size()] = NULL;


       if (strcmp(cmd, \"exit\") == 0)
       {
           {
               exit(0);

           }
       }

       //else if (strcmp(args[0], \"cd\") == 0) change_dir(args);

       if (strcmp(cmd, \"cd\") == 0)
       {
           change_dir(argv);
       }

       if (strcmp(cmd, \"help\") == 0)
       {
           helper_func(argv);
       }

       else
       {
           pid_t pid;
           pid_t wpid;
           int status;
           pid = fork();
           if (pid == 0)
           {
               if (execvp(args[0], argv) == -1)
               {
                   perror(\"cmd\");
               }
               exit(EXIT_FAILURE);
           }
           else if (pid < 0)
           {
               perror(\"cmd\");
           }
           {
               do {
                   wpid = waitpid(pid, &status, WUNTRACED);

               } while (!WIFEXITED(status) && !WIFSIGNALED(status));
           }
       }
   }
   signal(SIGINT, SIG_IGN);
   signal(SIGTERM, SIG_DFL);

   return 0;
}

Solution

#include
#include
#include
#include
#include
#include
using namespace std;
int change_dir(char* args[])
{
   if (args[1] == NULL)
   {
       chdir(getenv(\"HOME\"));
       return 1;
   }

   else
   {
       if (chdir(args[1]) == -1)
       {
           cout << \"No such directory\" << args[1];
           return -1;
       }
   }
   return 0;

}
int helper_func(char* args[])
{
   cout << \"Builtin commands so far are; cd, and help. \";

   return 0;
}
int main()
{
   while(true)
   {
       cout << \"$ \";
       char cmd[128];
       cin.getline(cmd,128);

       vector args;
       char *line = strtok(cmd, \" \");
       char *tmp = line;
       while (tmp != NULL)
       {
           args.push_back(tmp);
           tmp = strtok(NULL, \" \");
       }

       char** argv = new char*[args.size() + 1];
       for (int i = 0; i < args.size(); i++)
           argv[i] = args[i];

       argv[args.size()] = NULL;


       if (strcmp(cmd, \"exit\") == 0)
       {
           {
               exit(0);
           }

       }

       //else if (strcmp(args[0], \"cd\") == 0) change_dir(args);

       if (strcmp(cmd, \"cd\") == 0)
       {
           change_dir(argv);
       }

       if (strcmp(cmd, \"help\") == 0)
       {
           helper_func(argv);
       }

       else
       {
           pid_t pid;
           pid_t wpid;
           int status;
           pid = fork();
           if (pid == 0)
           {
               if (execvp(args[0], argv) == -1)
               {
                   perror(\"cmd\");
               }
               exit(EXIT_FAILURE);
           }
           else if (pid < 0)
           {
               perror(\"cmd\");
           }
           {
               do {
                   wpid = waitpid(pid, &status, WUNTRACED);
               } while (!WIFEXITED(status) && !WIFSIGNALED(status));

           }
       }
   }
   signal(SIGINT, SIG_IGN);
   signal(SIGTERM, SIG_DFL);

   return 0;
}
Tags