Project1: Unix Shell using Multi-Processing - PowerPoint PPT Presentation

About This Presentation
Title:

Project1: Unix Shell using Multi-Processing

Description:

Use signal handler: CTRL-C is the SIGINT signal /* the signal handler function */ void handle_SIGINT() { write(STDOUT_FILENO,buffer,strlen(buffer)); ... – PowerPoint PPT presentation

Number of Views:30
Avg rating:3.0/5.0
Slides: 12
Provided by: Maril91
Category:

less

Transcript and Presenter's Notes

Title: Project1: Unix Shell using Multi-Processing


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
  • commandgt ls
  • commnadgt cat hello.cpp
  • commandgt ctr-c
  • commandgt ctr-d
  • commandgt 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-gt\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 ltctrlgtltcgt\n")
  • / wait for ltcontrolgt ltCgt /
  • 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?
Write a Comment
User Comments (0)
About PowerShow.com