1 / 10

Project1: Unix Shell with History Feature

Project1: Unix Shell with History Feature. Goals Descriptions Methodology Submission. Goals. Understand how a simple shell works. Understand systems calls, such as fork, read, wait, execvp, and etc. Understand signal handling mechanisms. Descriptions. Demo command> ls

dalerivera
Télécharger la présentation

Project1: Unix Shell with History Feature

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Project1: Unix Shell with History Feature • Goals • Descriptions • Methodology • Submission

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

  3. Descriptions • Demo • command> ls • commnad> cat proj1.c • command> ctr-c • command> ctr-d • 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 terminates the shell

  4. Methodology • How to get the command from the keyboard? • Use system call read() with STDIN_FILENO • 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 set background =1 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(" COMMAND->\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) if background == 1, the parent will wait, • otherwise returns to the setup() function. */ • }

  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 SININT 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 • Email to zhuy@seattleu.edu • All source files • A readme file that describes each file, how to compile the file(s), and how to run the file. If there is any problem running the file, please state it here as well. • Makefile is preferred!

  10. Questions

More Related