Compile instructions make ./mysh
Σκοπός O στόχος αυτής της εργασίας είναι να εξοικειωθείτε με την δημιουργία διεργασιών και τη διαχείριση αρχείων και σημάτων, γράφοντας ένα απλό κέλυφος mysh (my simple shell) σε περιβάλλουν Linux και στη γλώσσα προγραμματισμού C (ή C++). Διατύπωση του προβλήματος Το κέλυφος θα πρέπει να δίνει τη δυνατότητα στον χρήστη να δημιουργεί και να χειριζεται νέες διεργασίες και να δίνει την ευκαιρία στο χρήστη να εκτελεί οποιοδήποτε πρόγραμμα συστήματος είναι ήδη διαθέσιμο. Η κλίση του κελύφους είναι απλή και γίνεται ως εξής από την γραμμή κλήσης εντολών (prompt): linux01.di.uoa.gr:> ./mysh in-mysh-now:> Αναμένεται ότι το mysh θα χρησιμοποιήσει οποιαδήποτε πληροφορία είναι διαθέσιμη σε μεταβλητές περιβάλλοντος ώστε να επιτευχθεί σωστή διερμήνευση εντολών από το λειτουργικό σύστημα. Οι εντολές που εισάγονται στο κέλυφος, θα πρέπει να γίνονται parse από το πρόγραμμα και να μην καλούνται ως έχουν. Δεν γίνονται αποδεκτές υλοποιήσεις όπου οι εντολές κελύφους εκτελούνται ώς έχουν (π.χ. χρησιμοποιώντας την system()) Η διεπαφή και τα χαρακτηριστικά του κελύφους Το mysh θα πρέπει να παρέχει : ● Υποστήριξη Ανακατευθύνσεων ● Υποστήριξη σωληνώσεων (pipes) ● Εκτέλεση εντολών στο Background ● Διαχείριση Σημάτων (Signals) ● Υποστήριξη wild characters ● Διαχείριση aliases a)Υποστήριξη Ανακατευθύνσεων a.1)Ανακατεύθυνση εισόδου / εξόδου (I/O redirection) (< , > ): Στη συνέχεια ακολουθούν παραδείγματα χρήσης: in-mysh-now:> myProgram > out.txt Η εντολή myProgram τρέχει και το αποτέλεσμα αποθηκεύεται στο αρχείο out.txt. in-mysh-now:> myProgram < input.txt Η εντολή myProgram τρέχει και παίρνει input από το input.txt. in-mysh-now:> sort < file1 > file2 Tα περιεχόμενα του file1 ταξινομούνται και το αποτέλεσμα αποθηκεύεται στο file2. Σημείωση: Η εντολή sort χρησιμοποιείται ως παράδειγμα. Θα πρέπει οι ανακατευθύνσεις να λειτουργούν για όλες τις εντολές του υποκείμενου κελύφους. Το ίδιο ισχύει και για τα υπόλοιπα παραδείγματα που ακολουθούν. a.2)Ανακατεύθυνση προσθήκης σε υπάρχον αρχείο (>>) Το αποτέλεσμα εκτέλεσης του αριστερού μέρους θα πρέπει να προσαρτάται σε ένα υπάρχον αρχείο π.χ in-mysh-now:> cat file1 >> file2 b)Υποστήριξη σωληνώσεων (pipes) Παροχή σωλήνωσης (pipes) και συνδυασμός τους με ανακατευθύνσεις, δηλ: in-mysh-now:> cat file1 file2 file3 | sort > file4 τα περιεχόμενα των αρχείων file1 file2 file3 χρησιμοποιούνται σαν είσοδος στο πρόγραμμα sort και το αποτέλεσμα γράφεται στο αρχείο file4. c)Εκτέλεση εντολών στο Background (&) Δυνατότητα για εκτέλεση εντολών στο background με χρήση του τελεστή &: in-mysh-now:> sort file1 &; ls &; Όταν μια εντολή τρέχει στο background μπορεί και πρέπει να τρέχει ταυτόχρονα με την επόμενη προς εκτέλεση εντολή. d)Υποστήριξη wild characters Δυνατότητα χρήσης wild characters. Οι wild characters θα μπορούν να χρησιμοποιούνται για να ορίσουν ένα υποσύνολο των αρχείων του τρέχοντας καταλόγου. Για παράδειγμα η εντολή: in-mysh-now:> ls file*.t?t θα πρέπει να παρουσιάζει το υποσύνολο των αρχείων του τρέχοντος καταλόγου που έχουν πρόθεμα file και επέκταση που αρχίζει και τελειώνει με το χαρακτήρα t και ενδιάμεσα έχει έναν οποιοδήποτε χαρακτήρα. e)Διαχείριση aliases Δυνατότητα για δημιουργία/ καταστροφή aliases. Για παράδειγμα: in-mysh-now:> createalias myhome “cd /home/users/smith”; δημιουργεί ένα alias το οποίο ονομάζεται myhome κι αν κανείς το γράψει στην γραμμή εντολής, έχει ισοδύναμο αποτέλεσμα με εκείνο της εκτέλεσης ολόκληρης της εντολής (δηλ. cd /home/users/smith). Παρομοίως υπάρχει και η εντολή: in-mysh-now:> destroyalias myhome; που απενεργοποιεί το alias. f)Διαχείριση Σημάτων (Signals) Το κέλυφος σας θα πρέπει να μπορεί να διαχειρίζεται απλά signals. Πιο συγκεκριμένα θα πρέπει ο χρήστης να μπορεί να ● στείλει ένα control-C στη διεργασία που είναι σε εξέλιξη μέσω του prompt του mysh. Tο αποτέλεσμα θα πρέπει να είναι ο τερματισμός του προγράμματος που τρέχει αλλά ΟΧΙ του κελύφους mysh. ● στείλει ένα control-Z στη διεργασία που είναι σε εξέλιξη. Το κέλυφος θα πρέπει επίσης να αγνοεί το σήμα control-Ζ και να το προωθεί στο πρόγραμμα που τρέχει. g)Αποθήκευση ιστορικού (myHistory) Δυνατότητα ιστορίας εντολών. Το κέλυφος θα πρέπει να μπορεί να θυμάται και να ανακαλεί με απλό τρόπο τις τελευταίες 20 εντολές χρήστη. Ο χρήστης θα πρέπει να έχει τη δυνατότητα να εκτελέσει κάποια από αυτές τις εντολές χωρίς να χρειάζεται να την επαναπληκτρολογήσει