Assigned 9/27/05, due 5:00PM Monday, 10/3/05. 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().