Λειτουργικά Συστήματα (ΗΥ-345)
Χειμερινό Εξάμηνο 2010
Άσκηση 1
Παράδοση: 22/10/2010
Υλοποίηση του απλού shell "mysh"
Γράψτε ένα πρόγραμμα σε γλώσσα C που θα υλοποιεί ένα απλό shell (command interpreter)
στο λειτουργικό σύστημα UNIX. Με το πρόγραμμα αυτό θα εξοικιωθείτε με τη δημιουργία,
συγχρονισμό και εκτέλεση διεργασιών και με τις κλήσεις συστήματος (system calls) fork(),
wait() και exec().
Το απλό αυτό shell θα λέγεται "mysh" (από το my shell), το prompt του θα είναι: "mysh #" και θα έχει τις παρακάτω λειτουργίες :
-
Το shell θα διαβάζει εντολές από τον χρήστη και θα τις εκτελεί.
Αφού διαβάσει μια γραμμή εντολών, το mysh θα χρησιμοποιεί το system call fork(),
για να δημιουργήσει μια καινούρια διεργασία-παιδί η οποία θα εκτελεί την εντολή του χρήστη.
Η εκτέλεση της εντολής από τη διεργασία-παιδί θα γίνεται με τη χρήση ενός από τα system calls
της οικογένειας exec() (δείτε το manpage της exec).
Η πατρική διεργασία θα περιμένει τη διεργασία-παιδί να τελειώσει την εκτέλεσή της (χρησιμοποιώντας το system call wait() ),
οπότε και θα επιστρέφει στο prompt περιμένοντας τη νέα εντολή του χρήστη, εκτός αν ο χρήστης έχει πληκτρολογήσει το &
στο τέλος της εντολής, οπότε η πατρική διεργασία δεν θα περιμένει αλλά θα επιστρέφει αμέσως στο prompt για νέα εντολή.
-
Εκτός από τις εντολές του χρήστη, το mysh θα υποστηρίζει και τις παρακάτω δικές του εντολές :
-
history : Η εντολή history θα λειτουργεί όπως σε ένα από τα συνηθισμένα shells (csh, tcsh κτλ.)
αλλά με ενα υποσύνολο απο τις κανονικές του λειτουργίες.
Η εντολή history θα εκτυπώνει μια λίστα με τις εντολές που έχει εκτελέσει μέχρι εκείνη την ώρα ο χρήστης με την εξής μορφή:
(σειρά που δώθηκε η εντολή) (εντολή)
Ένα πιθανό παράδειγμα εξόδου είναι το εξής:
1. cd temp
2. ls
3. cp test1.c test2.c
4. cat test2.c
5. rm test2.c
6. mkdir test2
7. cd test2
8. ls
Επιπλέον, το shell σας θα πρέπει να υποστηρίζει εντολές της μορφής:
!n (όπου n θα είναι ο αριθμός απο μία απο τις εντολές που έχει δώσει ο χρήστης στο παρελθόν).
Για παράδειγμα, αν ο χρήστης δωσει την εντολή !4 τότε θα πρέπει το shell να εκτελέσει την εντολή cat test2.c
-
open : Η εντολή open ανοίγει αρχεία χρησιμοποιώντας ανάλογα με τον τύπο του, το εκάστοτε πρόγραμμα που
χρησιμοποιεί ο χρήστης ως default. Για παράδειγμα, αν ο χρήστης δώσει την εντολή
open foo.c
θα πρέπει η εντολή να ανοίξει το αρχείο χρησιμοποιώντας τον text editor που χρησιμοποιεί ο χρήστης.
Στην δικιά σας υλοποίηση θα πρέπει να κοιτάτε το extension του αρχείου και να εκτελείτε την κατάλληλη εντολή βάση της παρακάτω λίστας.
Text files: vim
Programming Source code files : vim
Web pages : lynx
Επιπλέον, η open θα υποστηρίζει και URLs. Αν ένας χρήστης πληκτρολογήσει ενα URL, θα πρέπει πρώτα να
χρησιμοποιήσετε το πρόγραμμα wget για να το κατεβάσετε τοπικά και κατόπιν να το ανοιξετε με το lynx.
Για παράδειγμα, αν ο χρήστης δώσει την εντολή:
open www.google.com
θα πρέπει να εκτελείται το πρόγραμμα wget με παράμετρο το URL www.google.com, και κατόπιν να εκτελείται
το πρόγραμμα lynx με παράμετρο το αρχείο που δημιούργησε το wget.
-
exit : Με την εντολή exit θα τερματίζεται η λειτουργία του mysh.
Παρατηρήσεις
- Η άσκηση είναι ατομική. Συμπεριλάβετε το όνομα σας και
το λογαριασμό σας (account) σε όλα τα αρχεία.
Μην παραδώσετε εκτυπώσεις των προγραμμάτων.
- Κατασκευάστε ένα αρχείο Makefile, έτσι ώστε
πληκτρολογώντας make all να γίνεται η μεταγλώττιση
(compilation) του προγράμματος και να παράγεται το εκτελέσιμο
αρχείο. Επίσης πληκτρολογώντας make clean να καθαρίζονται
όλα τα περιττά αρχεία, και να μένουν μόνο τα αρχεία που χρειάζονται
για τη μεταγλώττιση.
- Επιπλέον, δώστε και 1/2 - 1 σελίδα επεξηγήσεις και παραδείγματα
για τη χρήση του mysh που υλοποιήσατε.
- Κατασκευάστε to αρχείο "assign1.tar.gz" που θα περιέχει όλα τα
αρχεία που χρειάζονται για το compilation του mysh (χρησιμοποιώντας
την εντολή tar και για συμπίεση το πρόγραμμα gzip). Θα σας σταλεί
email πριν την παράδοση για το πως θα κάνετε submit την άσκηση.