* approach to tackling the assignment !!!! do it incrementally, write unit tests as you go, rerun all of your unit tests when you add anything new !!!! > design as you go (incrementally) and ask for input about your design before implementation if you've got questions/uncertainty * the environment ** the process environment extern char **environ; a null terminated array (i.e. vector) of pointers to char each element in the array is a name=value string functions putenv, getenv, and setenv all use and/or modify environ ** the shell environment is different varlib.h/c provides a data structure for maintaining the shell env it's also an array of ptrs to string with name=value it knows which variables are exported an exported variable is included in the environment when executing a child process on shell startup, you call VLenviron2table to copy the process env into the shell env before calling exec, you call VLtable2environ to load the exported variables into environ ** on fork, the child has a copy of the parent's memory (with some exceptions) on exec, the memory is cleared (mostly) when the new process is loaded the process environment (environ) _isn't_ cleared, so if it has all of the exported variables from varlib, the child can still see them after the exec call *