Okay, you're asking a pretty complex question here, but I'll try an explain as best I can. Firstly, a process on Linux:
Processes are stored in the task list which is (get ready for it) a Circular Doubly Linked List. These elements are Process Descriptors and contain everything theprocess needs to run in a struct task_struct- you'll find this in the header file <linux/sched.h>.
Right; now we know that, we can look at processes- a process must have a parent, apart from init(ish), though that is different. The parent calls the fork() system call which duplicates the existing process, though obviously with different PID and PPID and certain resources, and then calls exec() which loads a new executable to the addess space.
fork() is implemented through the clone() system call which takes flags to specify which resources to share, to specify different flags, you'd use a different fork; such as vfrok() or _clone().
Everything you never wanted to know about process creation in the kernel, so to translate to this; the shell creates a new process, the kernel calls fork() to create a new instance of the shell process (Which in turn uses clone() and some other stuff, thats probably less important to you). exec() then loads the command its self into the address space.
There, that should confuse you enough to go do your homework yourself.