Προγραµµατισµός 2 The shell 1
CLI vs GUI! CLI (Command Line Interface) Μεγαλύτερη ευελιξία και ταχύτητα Πιο εύκολο να γίνουν πολύπλοκες λειτουργίες. find. -mtime -2 -name '*.txt' -exec sed -i.bak 's/hi/bye/g' {} \; Scripts! GUI (Graphical User Interface) Πιο εύκολο στη χρήση για αρχάριους Διευκολύνει το multitasking! Και τα δύο είναι τρόποι επικοινωνίας µε το λειτουργικό σύστηµα. 2
Shell vs Terminal! Terminal Παλιά, συσκευή επικοινωνίας µε τον ΗΥ (πληκτρολόγιο + οθόνη) Τώρα, software abstraction 3
Shell vs Terminal! Shell Πρόγραµµα το οποίο τρέχει µέσω του terminal και µας επιτρέπει να επικοινωνήσουµε µε τον kernel. Βασικός σκοπός: job control επεξεργάζεται εντολές που διαβάζει από το standard input εµφανίζει αποτελέσµατα στο standard output διαχειρίζεται διεργασίες επιτρέπει ανακατεύθυνση Ε/Ε επιτρέπει χρήση αγωγών και pipelines επιτρέπει δηµιουργία δικών µας εντολών 4
Shell vs Terminal! Shell prompt line edition input history auto completion! Terminal job control (=εκκίνηση και διαχείριση προγραµµάτων) εκτέλεση διεργασιών στο background εφόσον δεν απαιτούν αλληλεπίδραση µε το χρήστη εναλλαγή εκτέλεσης διεργασιών σύνδεση διεργασιών µέσω pipe copy + paste output history 5
Sessions & process groups! Το λειτουργικό σύστηµα οµαδοποιεί διεργασίες για ευκολότερη διαχείριση. Process group = µια συλλογή από διεργασίες µε µοναδικό pgid Session = µια συλλογή από process groups! Sessions Κάθε session συνήθως σχετίζεται µε ένα terminal, το οποίο λέγεται controlling terminal των διεργασιών αυτού του session. Οι διεργασίες του session διαβάζουν από/γράφουν σε αυτό το terminal To controlling terminal διαχειρίζεται/ελέγχει τις διεργασίες στέλνοντας σήµατα σε αυτές. 6
Sessions & process groups! Process groups Μόνο ένα process group του session µπορεί να είναι στο foreground κάθε στιγµή. Όλα τα άλλα είναι στο background. Μπορούµε να ξεκινήσουµε ένα process απευθείας στο backround βάζοντας & στο τέλος της εντολής εκτέλεσής του. Μπορούµε να φέρουµε ένα process group στο foreground στο background µε fg. Μόνο µια διεργασία που είναι στο foreground µπορεί να διαβάζει από το terminal. Αν το terminal παράγει ένα σήµα αυτό αποστέλεται στο process group που βρίσκεται στο foreground. Αν µια διεργασία είναι στο background και θέλει να διαβάσει από το terminal, το terminal στέλνει στο process group της σήµα SIGTTIN. Το shell είναι υπεύθυνο να ανιχνεύει αν µια διεργασία έχει σταµατήσει και να παρέχει τη δυνατότητα στο χρήστη να τη συνεχίσει και γενικά να εναλλάσσει διεργασίες ανάµεσα στο foreground και στο background. 7
Shell & process groups! Γράφω./prog στο shell για να εκτελέσω το πρόγραµµα prog. Τι συµβαίνει? Το shell κάνει fork Το παιδί µπαίνει σε δικό του process group. Το παιδί επιστρέφει στο default το χειρισµό σηµάτων που σχετίζονται µε job control (γιατί? τι ήταν πριν?) Το παιδί κάνει exec το prog Το shell µπαίνει στο background ώστε να εκτελεστεί το παιδί στο foreground Το shell περιµένει να τελειώσει το παιδί. Όταν το παιδί τερµατίσει, το shell µπαίνει πάλι στο foreground. 8
Shell & process groups! Γράφω cat στο shell. Μετά Ctrl-C. Ποιος λαµβάνει το σήµα και τι θα συµβεί?! Γράφω exec cat στο shell. Μετά Ctrl-C. Ποιος λαµβάνει το σήµα και τι θα συµβεί? 9
Shell & process groups! Γράφω./prog & στο shell. Τι συµβαίνει? Οµοίως µε πριν αλλά το prog εκτελείται στο background, ανεξάρτητα από το shell. Το shell παραµένει στο foreground. Αν το prog χρειαστεί να διαβάσει από το terminal, θα σταµατήσει. Αν το prog χρειαστεί να γράψει στο terminal, συνήθως µπορεί (εξαρτάται από ρυθµίσεις) 10
Shell & process groups! Γράφω./prog1./prog2 στο shell. Τι συµβαίνει? Το shell δηµιουργεί το pipe και κάνει fork Τα παιδιά µπαίνουν όλα σε ένα νέο process group. Κάθε παιδί κάνει reset το χειρισµό σηµάτων. Κάθε παιδί κάνει τα κατάλληλα dup και µετά exec Το shell µπαίνει στο background. Το shell περιµένει να τελειώσουν τα παιδιά. 11
Shell & process groups! Γράφω./prog1./prog2 στο shell και πριν ολοκληρωθεί η εκτέλεση, γράφω ctrl-c. Τι συµβαίνει? Αποστέλεται SIGINT στο process group που βρίσκεται στο foreground, άρα και στο prog1 και στο prog2. 12
Shell & process groups! Γράφω./prog1./prog2 & στο shell. Τι συµβαίνει? Οι διεργασίες prog1, prog2 εκτελούνται στο background. Μπορώ να τις επαναφέρω στο foreground µε την εντολή fg Τι θα συµβεί αν η prog1 χρειάζεται να πάρει είσοδο από το standard input? 13
Shell programming! Μπορούµε να: γράψουµε εντολές του shell σε ένα αρχείο να εκτελέσουµε το αρχείο! Με άλλα λόγια, µπορούµε να δούµε το shell ως γλώσσα προγραµµατισµού Ορίζουµε µεταβλητές Χρησιµοποιούµε δοµές ελέγχου κι επανάληψης Ορίζουµε συναρτήσεις Το τελικό "προϊόν" λέγεται shell script. 14
Shell programming! Η πρώτη γραµµή ξεκινά πάντα µε #! και προσδιορίζει ποιο shell θέλουµε να εκτελέσει τον κώδικα που ακολουθεί (όχι απαραίτητα το ίδιο µε αυτό που τρέχουµε). πχ. #!/bin/bash! Όποια άλλη γραµµή ξεκινά µε # αντιµετωπίζεται ως σχόλια και αγνοείται.! Το αρχείο έχει τυπικά επέκταση.sh! Για να εκτελέσουµε ένα αρχείο myscript.sh είτε γράφουµε sh myscript.sh είτε θέτουµε execute permission µε χρήση chmod και εκτελούµε κανονικά./myscript.sh 15
Παράδειγµα #!/bin/sh for dir in * do if [ -d $dir ] then cd $dir for i in *.java do sed -i '' '/^package/d' $i done cd.. fi done 16
Παράδειγµα! Θυµηθείτε την προηγούµενη διάλεξη: Για να µετρήσουµε το χρόνο εκτέλεσης ενός σύντοµου προγράµµατος, µπορούµε απλά να το τρέξουµε πολλές φορές και να διαιρέσουµε το χρόνο µε το πλήθος εκτελέσεων. Πώς θα το κάναµε αυτό µε ένα script? 17
18