1) The man pages are very helpful. Please use man command to understand the new system calls, and new functions such as dup(), dup2(). If you dont' know, how to use man command, then type man man :-) 2) Redirection of input and output: Your shell program should also support input and output redirection, for example, w > users.txt would run the w command that displays information about currently logged-in users and save its output in a ile called users.txt. Similarly, if we wanted to know the number of lines in the file we just created: wc -l < users.txt would make the file users.txt appear as standard input to the wc program. To implement input/output redirection of child processes you will have to manipulate file descriptors using the dup2() system call. For example, to connect a file to standard input: if ((( fd = open (fname, O_RDONLY )) == -1 ) { fprintf(stderr, "Error: couldn’t open %s\n.", fname); exit(1); } dup2(fd, 0); close(fd); Be careful as to the distinction between parent and child when you use this. 3) Execution of commands in the background The next step of complexity in your implementation will be handling execution of commands in the background, for example xemacs pipe1.c & would run the xemacs editor in the background. When a process is executing in the background, the shell should not block and wait but rather continue accepting commands. A shell with forked child processes executing in the background must be able to tell when the child processes exit. It can do this either syn- chronously or asynchronously. In the synchronous approach, the shell periodically polls for child termination. You can do this by using some of the wait() system calls with the WNOHANG flag. This approach is easier to implement.