1answer.
Ask question
Login Signup
Ask question
All categories
  • English
  • Mathematics
  • Social Studies
  • Business
  • History
  • Health
  • Geography
  • Biology
  • Physics
  • Chemistry
  • Computers and Technology
  • Arts
  • World Languages
  • Spanish
  • French
  • German
  • Advanced Placement (AP)
  • SAT
  • Medicine
  • Law
  • Engineering
avanturin [10]
3 years ago
12

In this assignment, you will write a complete C program that will act as a simplecommand-line interpreter (i.e., a shell) for th

e Linux kernel. In writing your shell, you areexpected to use the fork-exec-wait model discussed in class. In particular, you are toimplement the following:• Loop continuously until the user enters quit, which exits your shell.• Inside the loop, you will print your "minor5" prompt and read in the user’scommand, which may consist of a Linux command with 0 or more options andarguments supported by the command. You are expected to read in and processonly 1 command at a time with no pipelining or redirection.• In a child process, you are to execute the command as given, including alloptions and arguments given. If the command is not valid, rather than display an"exec failed" message as shown in class examples, you will simply print outthe command itself with "command not found" as shown in the SAMPLEOUTPUT and then exit the child process. The parent process should wait for thechild process to finish.If you have any questions about this, please contact your instructor, TAs, or IAsassigned to this course to ensure you understand these directions.SAMPLE OUTPUT (user input shown in bold):$ ./a.outminor5> lsa.out grades.txt rec01.txt testdir phone.txt route.txt who.txtdu.txt rec01.c file1 rec01sol.c minor5.cminor5> ls -a -l -ttotal 144-rwx------ 1 cat0299 cat0299 7835 Oct 14 17:39 a.outdrwx------ 4 cat0299 cat0299 4096 Oct 14 17:39 .-rw------- 1 cat0299 cat0299 2665 Oct 14 17:39 minor5.c-rw------- 1 cat0299 cat0299 33 Oct 5 03:30 du.txt-rw------- 1 cat0299 cat0299 33 Oct 5 01:28 file1-rw------- 1 cat0299 cat0299 333 Oct 5 01:02 route.txt

Computers and Technology
1 answer:
jolli1 [7]3 years ago
7 0

Answer:

/ to access the input scanf()

// and output printf()

#include <stdio.h>  

// to access the functions like

// pipe(), fork(), execvp(), dup2()

#include <unistd.h>  

// to access the string functions like

// strtok()

#include <string.h>

// to access function wait()

#include <sys/wait.h>

#include <stdlib.h>

int main()

{

  // declare a variable to hold the process id

  pid_t p_id;

  // declare a variable to hold the index value

  int array_index;

  // declare the string to hold the user input

  // as command

  char userIn_Command[128];

  // use a continuous loop

  while (1)

  {

      // display the prompt for the user

      printf("minor5> ");

      // read the input from the user

      scanf("%[^\n]", userIn_Command);

      // check the condition that whether the user

      // inputs a command called "quit"

      // If the user inputs quit command then exit from

      // the script

      if (strcmp(userIn_Command, "quit") == 0)

      {

          printf("\n");

          break;

      }

      // if there are any usage of pipelining or redirection

      // display the error message and exit from the script

      if (strchr(userIn_Command, '|') != NULL || strchr(userIn_Command, '>') != NULL ||

          strchr(userIn_Command, '<') != NULL)

      {

          printf("Error: Cannot perform the multiple command operations or directions\n");

          break;

      }

      // declare the variables to hold the process

      int p_pids[2];

      // create the system call to pipe() from kernal

      // and display the error message

      if (pipe(p_pids) < 0)

      {

          printf("Error: Pipe creation failed!\n");

      }

      // create the child process

      p_id = fork();

      // condition to check whether the fork() is

      // created. If so, display an error message

      if (p_pids < 0)

      {

          printf("Error: fork() failed!\n");

          break;

      }

      // if the child process is created

      if (p_id == 0)

      {

          // close pipe in child process

          close(p_pids[0]);

          // create duplicate of the standard output

          dup2(p_pids[1], STDOUT_FILENO);

          // close the pipe in child process

          close(p_pids[1]);

          // declare a variable to store path

          // to execute the command

          char *command_path;

          // declare an array of string to hold the options

          char * args[32];

          // tokenize the command by using the delimiter at " "(single space)

          char *cmd_token = strtok(userIn_Command, " ");

          // store the token value

          command_path = cmd_token;

          args[0] = cmd_token;

          array_index = 1;

          // loop until all the options in the command are

          // tokenized

          while (1)

          {

              // get the next token

              cmd_token = strtok(NULL, " ");

              // condition to check whether the token is null

              // or not

              if (cmd_token == NULL)

              {

                  break;

              }

              // store the token if it is not null

              args[array_index] = cmd_token;

              // increment the index

              array_index++;

          }

          // last parameter to the command should be NULL */

          args[array_index] = NULL;

                     

          /* calling exec function with command path and parameters */

          if (strcmp(args[0], "cd") == 0 || strcmp(args[0], "history") == 0 ||

              strcmp(args[0], "exit") == 0)

          {

              printf("%s: Command not found\n", args[0]);

              break;

          }

          if (execvp(command_path, args) < 0 )

          {

              printf("%s: Command not found\n", args[0]);

              break;

          }

      }

      else

      {          

          /* closing writing end of pipe in parent process */

          close(p_pids[1]);

          /* reading ouput written to pipe in child process and

          * writing to console */

          while (1)

          {

              char output[1024];

              int n = read(p_pids[0], output, 1024);

              if (n <= 0)

              {

                  break;

              }

              output[n] = '\0';

              printf("%s", output);

          }

          /* closing read end of pipe1 */

          close(p_pids[0]);

          /* waiting until child process complete its execution */

          wait(NULL);

      }

      /* skipping newline character read while scanf() */

      getchar();

  }

  exit(0);

}

Explanation:

You might be interested in
When your tire blows out in the middle of a drive, you should _____. A. let go of the steering wheel B. pump the brakes immediat
notsponge [240]
The answer is D. Because you are in the middle of the road so put your caution lights on and steer to the side of the road
3 0
4 years ago
Read 2 more answers
WILL GIVE BRAINLEIST PLZ HELP PLZ AND THANK YOU
Anna35 [415]

Answer:

SIR I AM A BRAINLT MODERRATER U CAN NOT POST THINGS LIKE THIS  I LOOKED THIS UP AND ITS A TEST

Explanation:

3 0
3 years ago
Yall like portal 1 or 2
balu736 [363]

yessir i like 2 better cause the plot is better

8 0
3 years ago
The text size can be found in ?
Greeley [361]

Answer:

Microsoft word.

Explanation:

i am very sorry if the answer is wrong

3 0
3 years ago
Distinguish between weighted codes and non weighted codes​
Gnom [1K]

Answer:

In weighted codes, each digit is a assigned a specific weight according to its position. NON- WEIGHTED CODE - The Non - Weighted Code are not positionally weighted. In other words, codes that are not assigned with any weight to each digit position. Hope it helpful U.

8 0
3 years ago
Other questions:
  • What can you learn at Udemy.com?
    11·1 answer
  • The ____ provides access to the Internet may also be internal.
    14·2 answers
  • In 1913, __________ developed a mass production system for cars that made it possible to produce more cars in a shorter period o
    5·2 answers
  • When a CPU executes each instruction in a program, it uses a process known as the __________.
    15·1 answer
  • What types of storage can be used to access your data on another computer
    5·1 answer
  • Write a program to take in a time-of-day on the command-line as 3 integers representing hours, minutes, and seconds, along with
    13·1 answer
  • Why is it necessary to have usernames and passwords if one is working on a network?​
    12·1 answer
  • Que segnifica mmmju?​
    15·1 answer
  • How to resize an image in photoshop without losing quality.
    11·1 answer
  • String objects are modified with string slices true or false
    9·1 answer
Add answer
Login
Not registered? Fast signup
Signup
Login Signup
Ask question!