ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ IΙ Λύβας Χρήστος chrislibas@ssl-unipi.gr Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος
>_ ΣΩΛΗΝΩΣΕΙΣ (PIPES) +- Τροφοδότηση της δεύτερης εντολής με το αποτέλεσμα (έξοδος) της πρώτης. Αντί να χρησιμοποιούμε προσωρινές μεταβλητές μεταφέρουμε το αποτέλεσμα της προηγουμένης εντολής στην επομένη. +- ls /etc more +- cat /etc/passwd tail -n 1
>_ ΚΑΝΟΝΙΚΕΣ ΕΚΦΡΑΣΕΙΣ +- Οι κανονικές εκφράσεις χρησιμοποιούνται από διάφορες εντολές στο unix και κυρίως από την sed, την grep και την awk, οι οποίες έχουν να κάνουν με την επεξεργασία συμβολοσειρών. +- [...] Οτιδήποτε περιέχεται στις αγκύλές +-. Ταιριάζει με οποιονδήποτε χαρακτήρα +- Συμβολοσειρά $ Ταιριάζει patterns που τελειώνουν με τη Συμβολοσειρά +- ^Συμβολοσειρά Ταιριάζει patterns που αρχίζουν με τη Συμβολοσειρά +- /^$/ Ταιριάζει κενές γραμμές +- \ Ακυρώνει την ειδική σημασία των μεταχαρακτήρων.
>_ SED (1/7) +- Προκειμένου να αυτοματοποιήσουμε τις αλλαγές στα περιεχόμενα ενός αρχείου, κάνουμε χρήση κάποιων μηχανισμών. Ένας από αυτούς είναι η εντολή sed. +- Όπως είπαμε και πριν η sed υποστηρίζει κανονικές εκφράσεις και επίσης υποστηρίζει εντολές: +- Αντικατάστασης +- Διαγραφής +- Προσάρτησης +- Παρεμβολής και +- Αλλαγής
>_ SED (2/7) +- Όσον αφορά τη δυνατότητα της αντικατάστασης κειμένου σε ένα αρχείο η sed συντάσσεται ως εξής: sed [επιλογές] s/παλιό κείµενο/νέο κείµενο/[παράµετροι] π.χ sed `s/palio/neo/` keimeno.txt +- Επιλογές Ø [g] Εφαρμογή της αντικατάστασης σε όλες τις εμφανίσεις του κειμένου που αντικαθίσταται (global) π.χ sed `s/palio/neo/g` keimeno.txt Ø [αριθμός] Εφαρμογή της αντικατάστασης στη nοστή εμφάνιση ανά γραμμή π.χ sed `s/palio/neo/3` keimeno.txt Ø [w] Εγγραφή των αλλαγών σε αρχείο Ø [p] Εμφάνιση στην οθόνη των γραμμών που αλλάχτηκαν Ø [i] Αγνόηση για πεζά-κεφαλαία π.χ sed `s/palio/neo/3pw` keimeno.txt
>_ SED (3/7) +- Επιλογές: +- -n Δεν εμφανίζει το αλλαγμένο αρχείο στην οθόνη (η sed από μόνη της εκτελεί μία cat μετά την ολοκλήρωσή της) π.χ sed -n `s/palio/neo/g` keimeno.txt +- -e Εκτέλεση περισσότερων αλλαγών π.χ sed -e `s/palio/neo/g` e`s/palio1/neo1/g` keimeno.txt +- -I Αποθήκευση των όποιων αλλαγών +- Σημαντικό! Μπορούμε να επιλέξουμε σε ποιες γραμμές θέλουμε να εφαρμοστεί η αντικατάσταση. π.χ sed -n `s/palio/neo/3` keimeno.txt +- Επίσης το σύμβολο & λαμβάνει την τιμή του νέου κειμένου π.χ sed -n `new_line@&/g` keimeno.txt
>_ SED (4/7) +- Άλλα παραδείγματα sed s/^*a -Z][1-4+*//g keimeno.txt sed s/^.txt$/removed/g keimeno.txt sed 10,90s/^*^t+.* \.txt$/removed/g keimeno.txt sed -i s/ \(^[0-9]\{2,3\}\)*/code removed/1
>_ SED (5/7) +- Μία άλλη δυνατότητα της sed εκτός της αντικατάστασης είναι και η διαγραφή. Στην περίπτωση της διαγραφής έχουμε την εξής σύνταξη: +- sed /keimeno/d π.χ sed /skoupidia.txt/d` +- Πώς διαγράφουμε συγκεκριμένες γραμμές +- n,kd Διαγραφή των γραμμών από την n έως την k +- n,k!d Διαγραφή όλων των γραμμών εκτός των n με k +- n,$ Διαγραφή όλων των γραμμών από το n και κάτω π.χ +- sed 5,10d keimeno.txt +- sed 30,$ keimeno.txt +- sed /^$/d keimeno.txt +- sed "/$kati/d keimeno.txt
>_ SED (6/7) +- Μιλήσαμε για την αντικατάσταση και τη διαγραφή. Όμως η sed μας παρέχει επιπλέον προσάρτηση, παρεμβολή κειμένου και αλλαγή ολόκληρης γραμμής. Για να επιτύχουμε αυτές τις λειτουργίες, χρησιμοποιούμε τη σύνταξη: +- sed / palio/διακόπτης\neo +- Διακόπτες: +- a\ Προσάρτηση του νέου κειμένου στην επόμενη γραμμή από το παλιό +- i\ Παρεμβολή του νέου κειμένου στην πάνω γραμμή από το παλιό +- c\ Αλλαγή της γραμμής που περιέχεται το παλιό με το νέο
>_ WHY IS THE C PROGRAMMING LANGUAGE STILL USED? +- The UNIX operating system s development started in 1969, and its code was rewritten in C in 1972 +- Linux is also written mostly in C, with some parts in assembly +- Microsoft s Windows kernel is developed mostly in C, with some parts in assembly language. +- Mac computers are also powered by C, since the macos kernel (C, C++, Objective-C, Swift) is written mostly in C. +- ios, Android and Windows Phone kernels are also written in C. +- 3D games are created with applications that are generally written in C (Unity) and C++ (Unity, Unreal Engine). +- Embedded system s cores are usually written in C. +- Oracle database development started in 1977, and its code was rewritten from assembly to C in 1983
>_ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ C +- Γράφουμε τα προγράμματά μας σε C (πηγαίος κώδικας σε αρχεία με κατάληξη.c). +- Ο μεταγλωττιστής (compiler) είναι ένα πρόγραμμα που μετατρέπει τα πηγαία αρχεία σε αντικειμενικά αρχεία (object files κατάληξη.ο), τα οποία είναι διατυπωμένα στη γλώσσα μηχανής του επεξεργαστή του υπολογιστή μας. +- Τα αντικειμενικά αρχεία δεν είναι άμεσα εκτελέσιμα από τον επεξεργαστή, εκτός του ότι το καθένα από αυτά μπορεί να μην συνιστά ένα πλήρες πρόγραμμα. +- Ο συνδέτης (linker) μετατρέπει ένα σύνολο από αντικειμενικά αρχεία, καθώς και τυχόν βιβλιοθήκες (libraries) που θα του δοθούν, σ ένα εκτελέσιμο αρχείο (executable file), το οποίο επίσης είναι διατυπωμένο σε γλώσσα μηχανής, αλλά είναι άμεσα εκτελέσιμο από τον επεξεργαστή.
>_ ΜΕΤΑΓΛΩΤΤΙΣΤΗΣ GCC (1/2) +- O Μεταγλωττιστής gcc της C, αποτελεί πρόγραμμα ελευθέρου λογισμικού (GNU Γενική Άδεια Δημόσιας Χρήσης), σε λειτουργικό σύστημα Unix. (θα χρησιμοποιηθεί στο μάθημα) +- gcc myprog.c Μεταγλώττιση του πηγαίου προγράμματος myprog.c σε αντικειμενικό αρχείο και κλήση του συνετή για την κατασκευή του εκτελέσιμου προγράμματος a.out +- gcc -o myprog myprog.c Μεταγλώττιση του πηγαίου προγράμματος myprog.c σε αντικειμενικό αρχείο και κλήση του συνδέτη για την κατασκευή του εκτελέσιμου προγράμματος myprog +- gcc -c myprog.c Μόνο μεταγλώττιση του πηγαίου προγράμματος myprog.c στο αντικειμενικό αρχείο myprog.o +- gcc -o prog myprog1.o myprog2.o lm Μόνο κλήση του συνδέτη για κατασκευή του εκτελέσιμου προγράμματος prog από τα αντικειμενικά αρχεία myprog1.o και myprog2.o και τη μαθηματική βιβλιοθήκη (m)
>_ ΜΕΤΑΓΛΩΤΤΙΣΤΗΣ GCC (2/2) +- Άλλες ενδιαφέρουσες επιλογές του gcc, εκτός από τις -o, -c και -l: +- Για να κληθεί μόνο ο προεπεξεργαστής, -E +- Για να παραχθεί το αποτέλεσμα σε γλώσσα assembly, -S
>_ ΕΚΤΕΛΕΣΙΜΑ ΑΡΧΕΙΑ ΣΤΟ LINUX +-Τα εκτελέσιμα αρχεία του Linux είτε αποτελούν standalone προγράμματα (συνήθως χωρίς κατάληξη) είτε βιβλιοθήκες (shared objects με κατάληξη.so) ονομάζονται ELF (Executable and Linking Format) files.
>_ ΠΑΡΑΔΕΙΓΜΑ
>_ ΒΙΒΛΙΟΘΗΚΕΣ ΤΗΣ C +- Η γραμμη #include <stdio.h> είναι οδηγία προς τον προεπεξεργαστη της C να συμπεριλάβει σ εκείνο το σημείο τα περιεχόμενα του αρχείου επικεφαλίδας (header file) stdio.h, το οποίο περιέχει χρήσιμες δηλώσεις για τις συναρτήσεις εισόδου/εξό δου. +- Υπάρχουν όμως και άλλες βιβλιοθήκες, πχ: Το #include <math.h> χρειάζεται όταν χρησιμοποιείται στο πρόγραμμα η μαθηματικη συνάρτηση sqrt, για την εύρεση τετραγωνικής ρίζας, όπως και άλλες έ τοιμες συναρτήσεις. +- Ο όρος libc χρησιμοποιείται ως συντομογραφία για να περιγράψει την πρότυπη βιβλιοθήκη της C (standard C library) προσφέρει macros, ορισμούς τύπων (type definitions), μεθόδους για επεξεργασία συμβολοσειρών (string handling), μαθηματικούς υπολογισμούς, επεξεργασία εισόδου/εξόδου δεδομένων, μνήμης και services του λειτουργικού συστήματος.
>_ SYSTEM CALLS +- Οι διεργασίες χρηστών δεν μπορούν να πραγματοποιήσουν privileged ενέργειες. +- Οι διεργασίες χρηστών πρέπει να χρησιμοποιήσουν το λειτουργικό σύστημα ώστε αυτό να εκτελεί πάντα για λογαριασμό τους τις privileged ενέργειες. Αυτό επιτυγχάνεται μέσω των System Calls. +- Τα system call (περίπου 190) αποτελούν θεμελιώδη διεπαφή μεταξύ των εφαρμογών και του λειτουργικού συστήματος.
>_ LIBC και SYSTEM CALLS (1/2) +- Για το παράδειγμα εκτέλεσης της printf("hello World \n");
>_ LIBC και SYSTEM CALLS (2/2) +- Κάθε I/O System Call αντιπροσωπεύεται τουλάχιστον από μια αντίστοιχη I/O μέθοδο της LIBC System Calls open close read write lseek Library calls fopen fclose fread, getchar, scanf, fscanf, getc, fgetc, gets, fgets fwrite, putchar, printf, fprintf putc, fputc, puts, fputs fseek
>_ ΜΕΤΑΒΛΗΤΕΣ ΣΤΗ C +- Όπως κάθε γλώσσα προγραμματισμου υψηλου επιπέδου, έτσι και η C υποστηρί ζουν την ύπαρξη μεταβλητών (variables). Οι μεταβλητές που υποστηρίζονται στη C είναι: +- Για ακεραίους: short int ή short (συνήθως 2 bytes) int (συνήθως 4, σπανιότερα 2 ή 8, bytes, ανάλογα με το μέγεθος λέξης του επεξεργαστη ) long int ή long (συνήθως 4, μερικές φορές 8, bytes) long long int ή long long (συνήθως 8 bytes) +- Για χαρακτήρες, αλλα και ακεραίους char (1 byte) +- Για πραγματικούς αριθμούς (κινητής υποδιαστολής) float (απλής ακρίβειας, συνήθως 4 bytes) double (διπλής ακρίβειας, συνήθως 8 bytes) long double (εκτεταμένης ακρίβειας, συνήθως 16 bytes)
>_ ΔΟΜΗ ΕΠΙΛΟΓΗΣ ΣΤΗ C (1/4) if(boolean_έκφραση) { /* οι εντολές θα εκτελεστούν αν είναι αληθής η συνθήκη*/ εντολή_1; εντολή_2; : εντολή_n; } else { /* οι εντολές θα εκτελεστούν αν είναι ψευδής η συνθήκη*/ εντολή_1; εντολή_2; : εντολή_n; }
>_ ΠΑΡΑΔΕΙΓΜΑ
>_ ΔΟΜΗ ΕΠΙΛΟΓΗΣ ΣΤΗ C (2/4) if(boolean_έκφραση_1) { /* οι εντολές θα εκτελεστούν αν είναι αληθής η 1 η συνθήκη*/ εντολή_1; : εντολή_n; } else if (boolean_έκφραση_2){ /* οι εντολές θα εκτελεστούν αν είναι αληθής η 2 η συνθήκη*/ εντολή_1; : εντολή_n; } else { /* οι εντολές θα εκτελεστούν αν είναι ψευδής η 1 η και 2 η συνθήκη*/ εντολή_1; : εντολή_n; }
>_ ΠΑΡΑΔΕΙΓΜΑ
>_ ΔΟΜΗ ΕΠΙΛΟΓΗΣ ΣΤΗ C (3/4) if(boolean_έκφραση_1) { /* οι εντολές θα εκτελεστούν αν είναι αληθής η 1 η συνθήκη*/ if(boolean_έκφραση_2) { /* οι εντολές θα εκτελεστούν αν είναι αληθής η 2 η συνθήκη*/ εντολή_1; : εντολή_n; else { /* οι εντολές θα εκτελεστούν αν είναι ψευδής η 2 η συνθήκη*/ εντολή_1; : εντολή_n; } else { /* οι εντολές θα εκτελεστούν αν είναι ψευδής η 1 η συνθήκη*/ εντολή_2; : εντολή_n; }
>_ ΠΑΡΑΔΕΙΓΜΑ
>_ ΔΟΜΗ ΕΠΙΛΟΓΗΣ ΣΤΗ C (4/4) switch(έκφραση) { case σταθερά-έκφραση_1 : εντολή_1; break; case σταθερά-έκφραση_2 : εντολή_1; break; : case σταθερά-έκφραση_n : εντολή_1; break; default : εντολή_1; }
>_ ΠΑΡΑΔΕΙΓΜΑ
>_ ΔΟΜΗ ΕΠΑΝΑΛΗΨΗΣ ΣΤΗ C (1/3) while(συνθήκη) { εντολή_1; : εντολή_n; }
>_ ΠΑΡΑΔΕΙΓΜΑ
>_ ΔΟΜΗ ΕΠΑΝΑΛΗΨΗΣ ΣΤΗ C (2/3) for ( αρχικοποίηση ; συνθήκη ; προσαύξηση) εντολή_1; : εντολή_n; }
>_ ΠΑΡΑΔΕΙΓΜΑ
>_ ΔΟΜΗ ΕΠΑΝΑΛΗΨΗΣ ΣΤΗ C (3/3) do { εντολή_1; : εντολή_n; } while(συνθήκη);
>_ ΠΑΡΑΔΕΙΓΜΑ
>_ ΑΣΚΗΣΗ +-Πότε είναι το Ορθόδοξο Πάσχα ;
>_ ΣΥΜΒΟΛΟΣΕΙΡΕΣ ΣΤΗ C (3/3) +- Οι συμβολοσειρές στη C είναι μονοδιάστατοι πίνακες χαρακτήρων που τελειώνουν με τον χαρακτήρα '\0' (null character). char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; char greeting[] = "Hello";
>_ ΠΑΡΑΔΕΙΓΜΑ
Beware of bugs in the above code[s]; I have only proved it correct, not tried it Donald Ervin Knuth