CMPS 111: Introduction to Operating Systems
Programming Assignment #1: Writing a Shell
Due Tuesday, April 9, at midnight.
Remember: your programming assignment must be turned in online.
The goal of this assignment is to get everyone up to speed on system
programming and to gain some familiarity with the system call
interface. A secondary goal is to use some of the programming tools
provided in the Unix environment. In this assignment you are to
implement a Unix shell program. A shell is simply a program that
conveniently allows you to run other programs. Read up on your
favorite shell to see what it does.
You are provided with files called lex.c and
myshell.c which contains some code that
uses getline(), a function provided by lex.c to get and parse a line
of input. getline() returns an array of pointers to character
strings. Each string is either a word containing the letters,
numbers, ., and /, or a single character string containing one of the
special characters: ( ) < > | & ;.
To compile lex.c, you have to use flex: "flex lex.c". This will produce a
file called lex.yy.c. lex.yy.c and myshell.c must then be compiled and linked
in order to get a running program. In the link step you also have to use "-lfl"
to get everything to work properly. Use gcc for the compilation and linking.
Try it now with my versions of the files.
Your shell must support the following:
Note: You must check and correctly handle all return values. This means that
you need to read the man pages for each function to figure out what the possible
return values are, what errors they indicate, and what you must do when you get
- The internal shell command "exit" which terminates the shell.
Concepts: shell commands, exiting the shell
System calls: exit()
- A command with no arguments
Details: Your shell must block until the command completes and, if the return
code is abnormal, print out a message to that effect.
Concepts: Forking a child process, waiting for it to complete, synchronous
System calls: fork(), execvp(), exit(), wait()
- A command with arguments
Example: ls -l
Details: Argument 0 is the name of the command
Concepts: Command-line parameters
- A command, with or without arguments, executed in the background
For simplicity, assume that if present the & is always the last thing on
Example: xemacs &
Details: In this case, your shell must execute the command and return immediately,
not blocking until the command finishes.
Concepts: Background execution, signals, signal handlers, processes, asynchronous
System calls: sigset()
- A command, with or without arguments, whose output is redirected
to a file
Example: ls -l > foo
Details: This takes the output of the command and put it in the named file
Concepts: File operations, output redirection
System calls: freopen()
- A command, with or without arguments, whose input is redirected
from a file
Example: sort < testfile
Details: This takes the named file as input to the command
Concepts: Input redirection, more file operations
System calls: freopen()
- [Extra credit] A command, with or without arguments, whose output
is piped to the input of another command.
Example: ls -l | more
Details: This takes the output of the first command and makes it the input
to the second command
Concepts: Pipes, synchronous operation
System calls: pipe()
What to turn in
A compressed tar file of your project directory, including your design
document. You must do "make clean" before creating the tar file. In
addition, include a README file to explain anything unusual
to the TA testing procedures, etc. Your code and other
associated files must be in a single directory so they'll build
properly in the submit directory.
REMEMBER: Do not submit object files,
assembler files, or executables. Every file in the submit
directory that could be generated automatically by the compiler or
assembler will result in a 5 point deduction from your programming