Custom bash-like shell written in C as the portfolio project for OSU's Operating Systems I class. Demonstrates proficiency in the use of the Unix process API, signal handling, and I/O redirection.
Grade received: 100
- Provides prompt for running commands using bash-like syntax
- Supports execution of shell scripts
- Handles blank lines and comments (defined as lines beginning with the # character)
- Provides variable expansion for any instance of
$$
in a given command, replacing with the shell Process ID - Provides 3 built-in commands:
-
exit
: kills any processes / jobs started by shell before terminating shell itself -cd
: provides bash-like functionality using thechdir()
system call; supports both relative and absolute directory paths -status
: prints either the exit status or the terminating signal of the last foreground process run the shell, excluding the 3 built-in commands - Executes all other commands by creating new processes using the
fork()
,exec()
, andwaitpid()
system calls - Supports input and output redirection using the
dup2()
system call - Supports execution of commands in both the foreground and background
- Implements custom signal handlers for the SIGINT and SIGTSTP signals
(requires gcc compiler)
- download or clone project source files, navigate to directory and run:
make
./smallsh
- input the
exit
command
command [arg1 arg2 ...] [< input_file] [> output_file] [&]
- command is assumed to be comprised of words separated by spaces
- special symbols
<
,>
, and&
are recognized, but must be surrounded by spaces like other words - if standard input or output is to be redirected, the
>
or<
words followed by a filename word must appear after all the arguments. input redirection can appear before or after output redirection - the pipe operator,
|
, is not implemented - a command line has max length of 2048 characters, and 512 max arguments
- lines beginning with the
#
character (comments) or blank lines are both ignored (re-prompt for a new command) - any instance of
$$
in a command is expanded into the process ID of the shell itself. this is the only variable expansion supported by the shell - any command, with the exception of
exit
cd
andstatus
, can be run in either foreground or background- if command is to be executed in background, last word must be
&
- if command is to be executed in background, last word must be
- SIGINT (CTRL-C)
- ignored by shell itself, or any children running as background processes
- any child process running in foreground terminates itself upon receiving SIGINT
- SIGTSTP (CTRL-Z)
- ignored by a child process running in foreground, or any children running as background processes
- if received by parent processes running shell, shell enters state in which commands cannot be run in background (
&
operator is ignored; all commands are run in foreground) - if received again, shell toggles back to normal mode (background processes enabled)