130 likes | 144 Vues
Practice using fork and exec facilities of UNIX/Linux, create a shell, execute commands in background, use on-line documentation, interact with OS directly, implement special commands, and enhance shell functionalities.
E N D
Programming Project 1 – Fork Project 1, Fork
Programming Assignment • Write a command called doit to execute another command and print out statistics • Extend doit to become a basic shell that prompts for and executes commands • Extend your shell to shell2 to execute commands in the background Project 1, Fork
Purpose • To practice using the fork and exec facilities of Unix/Linux • To learn how to find and use on-line documentation about system calls and system facilities. • man pages • To be accustomed to speaking directly with the operating system Project 1, Fork
Part 1: doit • doit command:– • Take another command line as argument • Execute that command • Print out statistics about command • Must execute on a CCC or CS Linux system • May not use system() system call • Helpful hints:– • fork(), execvp(), wait() • getrusage(), gettimeofday() Project 1, Fork
Part 1 (output) % doit cat /etc/motd /* print the current message of the day */ /* statistics about the cat command */ Project 1, Fork
Part 2: shell • Repeatedly prompt for command lines • Execute each command and print out statistics, as in doit • Implement special “built-in” commands • exit • cd dir • Special conditions • Input from stdin • Exit on end of file • Complain about illegal commands • Check for line length, number of arguments Project 1, Fork
Part 2 output % shell ==>cat /etc/motd /* print the current message of the day */ /* statistics about the cat command */ ==>cd dir /* current directory is changed to dir */ ==>ls /* listing of files in current directory */ /* statistics about this ls command */ ==>exit % /* back to your previous Linux prompt */ Project 1, Fork
Part 3: Background execution (shell2) • Modify shell to support execute commands in background, indicated by ‘&’ character • Causes shell to prompt for next command before previous command is complete • jobs built-in command lists background tasks in progress • Report completion at next opportunity • E.g., the next time user types a command, but before executing that command Project 1, Fork
Part 3 output % shell2 ==>numbercrunch & [1] 12345 /* indicate background task #1, process id */ ==>jobs [1] 12345 numbercrunch /* print process id and command name for tasks */ ==>ls /* listing of files in the current directory */ /* statistics about this ls command */ ==>cat /etc/motd [1] 12345 Completed < background job command > /* statistics about background job */ /* print the current message of the day */ /* statistics about this cat command */ ==>exit % /* back to your previous Linux prompt */ Project 1, Fork
Work environment • You may do this work on • CCC machine • CS machine • Your virtual machine (if you have set it up already) • You may use C or C++ • Note: • CCC and CS do not use same version of Linux kernel or C/C++ compiler • Your virtual machine uses the latest version Project 1, Fork
Project submission • Due Monday, September 25, at start of class • Submit via turnin • command = ‘/cs/bin/turnin’ on CCC machines • classname = ‘cs502’ • assignment = ‘project1’ • Put your name at top of every file! (You would be surprised how many students forget!) Project 1, Fork
Project Submission (continued) • Code of your solution • Makefile to build all programs • One or more test cases • Write-up explaining everything • DO NOT • Put different parts of projects in folders • Create different Makefiles for different parts Project 1, Fork
Not a team project! • Each student must submit own solution • Encouraged to discuss general approach, meaning of system calls, etc., with friends • Encouraged to seek help if puzzled by some concept, system call, etc. • Distill all discussions into your own work! Project 1, Fork