Presentation is loading. Please wait.

Presentation is loading. Please wait.

Project1: Unix Shell using Multi-Processing

Similar presentations


Presentation on theme: "Project1: Unix Shell using Multi-Processing"— Presentation transcript:

1 Project1: Unix Shell using Multi-Processing
Goals Descriptions Methodology Submission

2 Goals Understand how a simple shell works.
Understand process creation & systems calls, such as fork, read, wait, execvp, and etc. Understand signal handling mechanisms

3 Descriptions Demo Input: commands from keyboard
command> ls commnad> cat hello.cpp command> ctr-c command> ctr-d command> cat hello.cpp & Input: commands from keyboard Fork a child process to perform the command Store the past commands in a buffer Given a signal, display the most recent commands in the buffer Ctrl-c and ctrl-d terminate the shell

4 Methodology How to get the command from the keyboard?
Use system call read() with STDIN_FILENO or 0 Implement a setup() void setup(char inputBuffer[], char *args[], int *background) setup() reads in the next command line, separating it into distinct tokens using whitespace as delimiters. setup() sets the args parameter as a null-terminated string. Also update background if & is met If “ctrl-d” is met, just simply call exit(0);

5 Methodology How to execute the command? while (1){ /* Program terminates normally inside setup */ background = 0; printf(" MyShell->\n"); setup(inputBuffer,args,&background); /* get next command */ /* the steps are: (1) fork a child process using fork() (2) the child process will invoke execvp() (3) the parent waits or returns to the setup() function, depending on background */ }

6 Methodology How to display recent commands?
Use signal handler: CTRL-C is the SIGINT signal /* the signal handler function */ void handle_SIGINT() { write(STDOUT_FILENO,buffer,strlen(buffer)); exit(0); } int main(int argc, char *argv[]) { /* set up the signal handler */ struct sigaction handler; handler.sa_handler = handle_SIGINT; sigaction(SIGINT, &handler, NULL); strcpy(buffer,"Caught <ctrl><c>\n"); /* wait for <control> <C> */ while (1); return 0;

7 Methodology How to keep track of past commands?
Limited-size buffer, why not use circular buffer? Modify setup() to store the current command which may overwrite the oldest command in the buffer Implement SIGINT signal handler to display the 10 most recent commands

8 Suggested Steps Step 1: implement setup()
Step 2: execute the command from setup() Step 3: add the history feature

9 Submission All source files
A readme file that describes each file, and how to run the file. If there is any problem running the file, please state it here as well. Makefile Tar package Electronic submission

10 Particular Notes for execvp() and its Variants
Replace the old program with a new one Never returns unless failures Often used after a fork() to load a new program for the current process! Other variants: execl(),…

11 Questions Makefile?


Download ppt "Project1: Unix Shell using Multi-Processing"

Similar presentations


Ads by Google