CS 213 Fall 2001 Lab Assignment L5 Writing Your Own Unix Shell Assigned Oct 25 Due Fri Nov 2 11 59PM Dave O Hallaron droh cs cmu edu is the lead person for this assignment Introduction The purpose of this assignment is to become more familiar with the concepts of process control and signalling You ll do this by writing a simple Unix shell program that supports job control Logistics As always you may work in a group of up to two people in solving the problems for this assignment The only hand in will be electronic Any clarifications and revisions to the assignment will be posted on the course Web page Hand Out Instructions All files you need are in the directory afs cs cmu edu academic class 15213 f01 L5 Start by copying the file L5 tar in that directory to the protected directory the lab directory in which you plan to do your work Then do the following Type the command tar xvf L5 tar to expand the tarfile Type the command make to compile and link some test routines Type your team member names and Andrew IDs in the header comment at the top of tsh c 1 Looking at the tsh c tiny shell file you will see that it contains a functional skeleton of a simple Unix shell To help you get started we have already implemented the less interesting functions Your assignment is to complete the remaining empty functions As a sanity check we ve listed the number of lines of code for each of these functions in our reference solution including comments eval Main routine that parses and interprets the command line 40 lines builtin cmd Recognizes and interprets the built in commands quit fg bg and jobs 25 lines do bgfg Implements the bg and fg built in commands 50 lines waitfg Waits for a foreground job to complete 46 lines sigchld handler Catches SIGCHILD signals 38 lines sigint handler Catches SIGINT ctrl c signals 14 lines sigtstp handler Catches SIGTSTP ctrl z signals 16 lines Each time you modify your tsh c file type make to recompile it To run your shell type tsh to the command line unix tsh tsh type commands to your shell here General Overview of Unix Shells A shell is an interactive command line interpreter that runs programs on behalf of the user A shell repeatedly prints a prompt waits for a command line on stdin and then carries out some action as directed by the contents of the command line The command line is a sequence of ASCII text words delimited by whitespace The first word in the command line is either the name of a built in command or the pathname of an executable file The remaining words are command line arguments If the first word is a built in command the shell immediately executes the command in the current process Otherwise the word is assumed to be the pathname of an executable program In this case the shell forks a child process then loads and runs the program in the context of the child The child processes created as a result of interpreting a single command line are known collectively as a job In general a job can consist of multiple child processes connected by Unix pipes If the command line ends with an ampersand then the job runs in the background which means that the shell does not wait for the job to terminate before printing the prompt and awaiting the next command line Otherwise the job runs in the foreground which means that the shell waits for the job to terminate before awaiting the next command line Thus at any point in time at most one job can be running in the foreground However an arbitrary number of jobs can run in the background For example typing the command line 2 tsh jobs causes the shell to execute the built in jobs command Typing the command line tsh bin ls l d runs the ls program in the foreground By convention the shell ensures that when ls begins executing its main routine int main int argc char argv the argc and argv arguments have the following values argc 3 argv 0 bin ls argv 1 l argv 2 d Alternatively typing the command line tsh bin ls l d runs the ls program in the background Unix shells support the notion of job control which allows users to move jobs back and forth between background and foreground and to change the process state running stopped or terminated of the processes in a job Typing ctrl c causes a SIGINT signal to be delivered to each process in the foreground job The default action for SIGINT is to terminate the process Similarly typing ctrl z causes a SIGTSTP signal to be delivered to each process in the foreground job The default action for SIGTSTP is to place a process in the stopped state where it remains until it is awakened by the receipt of a SIGCONT signal Unix shells also provide various built in commands that support job control For example jobs List the running and stopped background jobs bg job Change a stopped background job to a running background job fg job Change a stopped or running background job to a running in the foreground kill job Terminate a job The tsh Specification Your tsh shell should have the following features 3 The prompt should be the string tsh The command line typed by the user should consist of a name and zero or more arguments all separated by one or more spaces If name is a built in command then tsh should handle it immediately and wait for the next command line Otherwise tsh should assume that name is the path of an executable file which it loads and runs in the context of an initial child process In this context the term job refers to this initial child process tsh need not support pipes or I O redirection and Typing ctrl c ctrl z should cause a SIGINT SIGTSTP signal to be sent to the current foreground job as well as any descendents of that job e g any child processes that it forked If there is no foreground job then the signal should have no effect If the command line ends with an ampersand then tsh should run the job in the background Otherwise it should run the job in the foreground Each job can be identified by either a process ID PID or a job ID JID which is a small positive integer assigned by tsh JIDs should be denoted on the command line by the prefix For example 5 denotes JID 5 and 5 denotes PID 5 We have provided you with all of the routines you need for manipulating the job list tsh should support the following built in commands The quit command terminates the shell The jobs command lists all background jobs The bg job command restarts job by sending it a SIGCONT signal and then runs it in the background The job argument can be either a PID or a JID The …
View Full Document