At the end of this project, you are expected to be able to explain to anyone, without the help of Google:
- How does a shell work
- What is a
pidand appid - How to manipulate the environment of the current process
- What is the difference between a function and a system call
- How to create processes
- What are the three prototypes of
main - How does the shell use the
PATHto find the programs - How to execute another program with the
execvesystem call - How to suspend the execution of a process until one of its children terminates
- What is
EOF/ “end-of-file”?
- Allowed editors:
vi,vim,emacs - All your files will be compiled on
Ubuntu 20.04 LTSusinggcc, using the options-Wall -Werror -Wextra -pedantic -std=gnu89 - All your files should end with a new line
- A README.md file, at the root of the folder of the project is mandatory
- Your code should use the
Bettystyle. It will be checked usingbetty-style.plandbetty-doc.pl - Your shell should not have any memory leaks
- No more than 5 functions per file
- All your header files should be include guarded
- Use system calls only when you need to (why?)
- Write a
READMEwith the description of your project - You should have an
AUTHORSfile at the root of your repository, listing all individuals having contributed content to the repository. Format, see Docker
- Unless specified otherwise, your program must have the exact same output as
sh(/bin/sh) as well as the exact same error output. - The only difference is when you print an error, the name of the program must be equivalent to your
argv[0](See below) Example of error withsh:
$ echo "qwerty" | /bin/sh
/bin/sh: 1: qwerty: not found
$ echo "qwerty" | /bin/../bin/sh
/bin/../bin/sh: 1: qwerty: not found
$Same error with your program hsh:
$ echo "qwerty" | ./hsh
./hsh: 1: qwerty: not found
$ echo "qwerty" | ./././hsh
./././hsh: 1: qwerty: not found
$Your shell will be compiled this way:
gcc -Wall -Werror -Wextra -pedantic -std=gnu89 *.c -o hsh
Your shell should work like this in interactive mode:
$ ./hsh
($) /bin/ls
hsh main.c shell.c
($)
($) exit
$But also in non-interactive mode:
$ echo "/bin/ls" | ./hsh
hsh main.c shell.c test_ls_2
$
$ cat test_ls_2
/bin/ls
/bin/ls
$
$ cat test_ls_2 | ./hsh
hsh main.c shell.c test_ls_2
hsh main.c shell.c test_ls_2
$| File | Content |
|---|---|
| main.c | entry point, executing function |
| shell.h | function prototypes, standard libraries, structs |
| print_funcs.c | printing functions |
| print_errors.c | error printing functions |
| string_funcs_1.c | string-handling functions |
| string_funcs_2.c | string-handling functions |
| list_funcs_1.c | linked list handling functions |
| list_funcs_2.c | linked list handling functions |
| tokenize.c | string to tokens parsing functions |
| path_finder.c | functions that check the PATH for commands |
| builtins.c | functions dealing with the shell builtins |
| set_env.c | functions dealing with the setenv/unsetenv builtins |
| helper_funcs.c | memory and signal handling functions |
| convert_funcs.c | conversion between string and number functions |
| man_1_simple_shell | Simple Shell man page (man ./man_1_simple_shell) |