100 Points
Summary
Use the code in CSAPP2, 8.4.6 "Using fork and execve to Run Programs" as a starting point to develop and test a small version of a shell that forks processes in the foreground and/or the background.
What To Do
Follow the directions in BLS "How the Shell Works" lecture.
Start with program shellex.c from figures 8.22-8.24 and create your own shell by adding all the features described in the BLS lecture: read and parse command line, run command in foreground or background, implement redirection, implement pipe.
Notes:
Note 1: Although a real shell can accept a command line with an arbitrary number of pipes, in this homework it is sufficient to implement just one pipe. So, your shell should be able to handle correctly a command line like
command-1 | command-2 < input-file > output-file &
Notice that the placement of "< input-file" and "> output-file" in the command line is not critical since "< input-file" redirects the input of command-1 and "> output-file" redirects the output of command-2. If there is no pipe, "> output-file" redirects the output of command-1.
Note 2: Your shell program can execute programs in the current directory but does not inherit PATH automatically, so
> ls
does not work, but
> /usr/bin/ls works
and, this works (when myspin is in the current directory)
> myspin 10 &
Note 3: Files csapp.c, csapp.h, shellex.c, myspin.c are in FILES/PROGRAMS To compile and run shellex.c do the following
gcc -c csapp.c
gcc -o shellex shellex.c csapp.o -lpthread
/* $begin shellmain */ #include "csapp.h"
#define MAXARGS 128
/* function prototypes */ void eval(char*cmdline);
int parseline(char *buf, char **argv); int builtin_command(char **argv);
int main()
{
char cmdline[MAXLINE]; /* command line */
while (1) {
/* read */ printf("> ");
Fgets(cmdline, MAXLINE, stdin); if (feof(stdin))
exit(0);
/* evaluate */ eval(cmdline);
}
}
/* $end shellmain */
/* $begin eval */
/* eval - evaluate a command line */ void eval(char *cmdline)
{
char *argv[MAXARGS]; /* argv for execve() */
char buf[MAXLINE]; /* holds modified command line */ int bg; /* should the job run in bg or fg? */
pid_t pid; /* process id */
strcpy(buf, cmdline);
bg = parseline(buf, argv); if (argv[0] == NULL)
return; /* ignore empty lines */
if (!builtin_command(argv)) {
if ((pid = Fork()) == 0) { /* child runs user job */ if (execve(argv[0], argv, environ) < 0) {
printf("%s: Command not found.\n", argv[0]); exit(0);
}
}
DescriptionIn this final assignment, the students will demonstrate their ability to apply two ma
Path finding involves finding a path from A to B. Typically we want the path to have certain properties,such as being the shortest or to avoid going t
Develop a program to emulate a purchase transaction at a retail store. Thisprogram will have two classes, a LineItem class and a Transaction class. Th
1 Project 1 Introduction - the SeaPort Project series For this set of projects for the course, we wish to simulate some of the aspects of a number of
1 Project 2 Introduction - the SeaPort Project series For this set of projects for the course, we wish to simulate some of the aspects of a number of