CS 332: Operating Systems
A little command shell
Due 8:30 AM Monday, 4/28/08. Hand in using
HSP.
Write a small command shell. In particular, your shell should:
- Print a prompt.
- Get a command line from the user
- Search the $PATH environment variable for a program
whose name is the first word in the command string, and fork a child process
to execute the first such program found, passing the command-line arguments
(including the program name itself) to the program (or
printing an error message if no command is found)
- wait for the execution to finish (unless the command was
terminated with an &, in which case you should go to step 5 immediately).
- Go to step 1.
Your shell should also trap CTL-C's--upon receiving a SIGINT,
it should tell the user to
type CTL-] followed by <return> to quit your shell.
You may work with a partner or alone, as you wish.
Here are a few technical points that may interest you:
- Typing CTL-] sends a character with ASCII value 29.
This character, known as "GS" or "Group Separator," goes
along with "FS" (28, CTL-\, "File Separator"),
"RS" (30, CTL-^, "Record Separator"),
and "US" (31, CTL-_, "Unit Separator"). The ASCII standard
says "These information separators may be used with data
in optional fashion, except that their hierarchical relationship
shall be: FS as the most inclusive, then GS, then RS, and US
as least inclusive [is this a political statement?]. The
content and length of a file, group, record, or unit are not
specified." So in other words, nobody uses these characters
anymore, except when they need a character that nobody uses anymore.
- "man execl" will get you a started using exec. The "l" in
"execl" stands for "list," which means that when you call
execl(), you give it a list of command-line argument strings.
The "p" in "execlp" stands for "path," which means that "execlp"
looks for the file-to-be-executed in all the directories specified
in your PATH environment variable. To see what your PATH is,
type "echo $PATH" at the Unix prompt. If you want to look all
over the place for the file-to-be-executed, use execlp(). If you
only want to look in the current directory, use execl().
You might also wish to consider using execv() or execvp().
Important constraints
Once again, I would appreciate your assistance in making this
program logistically easy to grade. Everybody followed the spec last time,
and it helped me immensely. Again, following these rules will be
worth one point.
- Write your program in a single source file named shell.c (all
lower case).
- If you need to submit a revised version of your program, call
it shell1.c. A revision of the revision should be called
shell2.c, etc.
- Don't submit a folder for this assignment--just shell.c. If
you have "readme" information to communicate to me, just put
it in the comment at the top of shell.c.