Βασικές λειτουργίες συστήματος πάνω σε αρχεία δεδομένων. Προγραμματισμός II 1

Σχετικά έγγραφα
Περιγραφείς Αρχείων & Ανακατεύθυνση EE. Προγραμματισμός II 1

Αρχεία. Προγραμματισμός II 1

Αρχεία. Προγραμματισμός II 1

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Προγραμματισμός συστημάτων UNIX/POSIX. Ανακατευθύνσεις (redirections)

Διαδιεργασιακή επικοινωνία (inter-process communication IPC) Προγραμματισμός II 1

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Αγωγοί/Σωλήνες (Pipes) Προγραμματισμός II 1

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων.

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Διάλεξη 18η: Διαχείρηση Αρχείων

Αρχεία. Προγραμματισμός II 1

Δομημένος Προγραμματισμός

Προγραμματισμός συστημάτων UNIX/POSIX. Διαδιεργασιακή επικοινωνία: αγωγοί (IPC inter-process communication: pipes)

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Τµήµα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Σεπτέµβριος 2013

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Προγραμματισμός συστημάτων UNIX/POSIX

ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΩΝ Λέµε αρχείο

Μεθόδων Επίλυσης Προβλημάτων

Streams Input / Output in C++ George Kastrinis

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. ( ιάλεξη 13) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Εργαστήριο 9: Αρχεία

scanf() scanf() stdin scanf() printf() int float double %lf float

Εισαγωγή στον Προγραμματισμό

Διαδικασιακός Προγραμματισμός

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Ι (ΗΥ120)

Οργάνωση Υπολογιστών (IΙI)

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

Λειτουργικά Συστήματα (Λ/Σ)

Λειτουργικά Συστήματα - Εργαστήριο 4. 4ο Εργαστήριο

Ενδεικτική περιγραφή μαθήματος

Λιβανός Γιώργος Εξάμηνο 2017Β

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στο Λ.Σ. UNIX

Βασικές συσκευές Ε/Ε. Είσοδος Έξοδος στον υπολογιστή. Ένα τυπικό υπολογιστικό σύστημα σήμερα. Οργάνωση Υπολογιστών (IΙI) Μ.

H ΓΛΩΣΣΑ C. Μάθηµα 16: Είσοδος/Έξοδος: Συναρτήσεις Eξόδου. ηµήτρης Ψούνης

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Αρχεία Δεδομένων. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Λειτουργικό Σύστημα: διαχείριση πόρων. Τι είναι ένα αρχείο ; Διαχείριση αρχείων. Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

Προγραμματισμός Η/Υ. Χειρισμός Αρχείων. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Λειτουργικό Σύστημα: διαχείριση πόρων. Διαχείριση αρχείων. Τι είναι ένα αρχείο ; Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

Δομημένος Προγραμματισμός

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Διαδικασιακός Προγραμματισμός

Κύρια μνήμη. Μοντέλο λειτουργίας μνήμης. Ένα τυπικό υπολογιστικό σύστημα σήμερα. Οργάνωση Υπολογιστών (ΙI)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Ι (ΗΥ120)

Μετατροπή χαρακτήρων ASCII σε ακέραιο αριθµό (atoi) & Άνοιγµα αρχείου µέσα από τo QtSPIM, διάβασµα, και αποθήκευση του περιεχοµένου του στη µνήµη

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Επεξεργασία Αρχείων Κειµένου

Προγραµµατισµός Ι Αλφαριθµητικά Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Προγραµµατισµός Ι 1 Νικόλαος Δ.

Δομημένος Προγραμματισμός

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Μη ανασταλτική/πολυπλεξία Ε/Ε (non-blocking/multiplexed I/O) Προγραμματισμός II 1

FILE *fopen(const char *fname, const char *mode) void fclose(file *f) void fflush(file *f)

Ανάπτυξη και Σχεδίαση Λογισμικού

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Ανάπτυξη και Σχεδίαση Λογισμικού

Διαδικασιακός Προγραμματισμός

ιαφάνειες παρουσίασης #6 (β)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1

Εργαστήριο ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ UNIX

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

Εισαγωγή στην Πληροφορική

Αρχιτεκτονική Υπολογιστών

Προγραµµατισµός Ι (ΗΥ120)

Διαδικαστικός Προγραμματισμός

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

ΣΥΣΚΕΥΕΣ ΑΠΟΘΗΚΕΥΣΗΣ (ΜΝΗΜΗ)

Ανάπτυξη και Σχεδίαση Λογισμικού

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 4 - Editor

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

i Στα σύγχρονα συστήματα η κύρια μνήμη δεν συνδέεται απευθείας με τον επεξεργαστή

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ - UNIX. Συστήματα Αρχείων. Διδάσκoντες: Καθ. Κ. Λαμπρινουδάκης Δρ. Α. Γαλάνη

Περιεχόμενα. Πρόλογος... 21

File Management και I/O στο UNIX

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 5 - Editor

Οργάνωση Υπολογιστών (ΙI)

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Εισαγωγή στον Προγραμματισμό

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

Transcript:

Βασικές λειτουργίες συστήματος πάνω σε αρχεία δεδομένων 1 ais@inf.uth.gr

Βασικές λειτουργίες (1) int pen(cnst char *path, int fags, mde_t perms) ανοίγει το αρχείο με όνομα path (αν συμπεριλαμβάνεται ένα μονοπάτι καταλόγων, αυτό πρέπει ήδη να υφίσταται) Η επιθυμητή πρόσβαση προσδιορίζεται μέσω fags Ο_RDONLY,Ο_WRONLY,Ο_RDWR: διάβασμα, γράψιμο, και τα δύο Ο_APPEND,Ο_TRUNC: προσθήκη στο τέλος, κόψιμο αρχείου Ο_CREAT: δημιουργία αρχείου, αν δεν υπάρχει ήδη Ο_EXCL: μαζί με Ο_CREAT, αποτυχία αν το αρχείο υπάρχει Οι άδειες πρόσβασης προσδιορίζονται μέσω perms οκταδική τιμή (π.χ. 0700) ή συμβολική σταθερά (π.χ. S_IRWXU) λαμβάνονται υπόψη μόνο όταν δημιουργείται ένα νέο αρχείο 2 ais@inf.uth.gr

Περιγραφείς αρχείων (fie descriptrs) Σε περίπτωση επιτυχίας, η pen επιστρέφει τον λεγόμενο περιγραφέα αρχείου (fie descriptr) Οι περιγραφείς αρχείων είναι ακέραιοι δεν υπάρχει ειδικός τύπος δεδομένων για αρχεία Ο περιγραφέας αρχείου που επιστρέφεται χρησιμοποιείται στην συνέχεια ως αναφορά (reference) στο αρχείο Όλες οι βασικές λειτουργίες αρχείων δέχονται ως παράμετρο έναν περιγραφέα αρχείου (ακέραιο) π.χ. μια ακέραια τιμή που επέστρεψε η pen Περισσότερα για τους περιγραφείς αρχείων, αργότερα 3 ais@inf.uth.gr

Βασικές λειτουργίες (2) ssize_t read(int fd, vid *buf, size_t n) ανάγνωση δεδομένων από το αρχείο ssize_t write(int fd, vid *buf, size_t n) εγγραφή δεδομένων στο αρχείο ff_t seek(int fd, ff_t ps, int whence) μετακίνηση θέσης ανάγνωσης/εγγραφής int ftruncate(int fd, ff_t ength) κόψιμο/επέκταση του αρχείου int fsync(int fd) σύγχρονη αποθήκευση δεδομένων στον δίσκο int cse(int fd) κλείσιμο του περιγραφέα αρχείου 4 ais@inf.uth.gr

int fd; char str[]="he wrd"; fd=pen("",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,str,5); write(fd,&str[5],6); write(fd," :-)",4); str h e 68 65 6C 6C 6F w r d \0 20 77 6F 72 6C 64 00 ερμηνεία ως ASCII τιμή bytes στην μνήμη 5 ais@inf.uth.gr

int fd; char str[]="he wrd"; fd=pen("",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,str,5); write(fd,&str[5],6); write(fd," :-)",4); str h e 68 65 6C 6C 6F w r d \0 20 77 6F 72 6C 64 00 6 ais@inf.uth.gr

int fd; char str[]="he wrd"; fd=pen("",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,str,5); write(fd,&str[5],6); write(fd," :-)",4); str h e 68 65 6C 6C 6F w r d \0 20 77 6F 72 6C 64 00 68 65 6C 6C 6F 7 ais@inf.uth.gr

int fd; char str[]="he wrd"; fd=pen("",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,str,5); write(fd,&str[5],6); write(fd," :-)",4); str h e 68 65 6C 6C 6F w r d \0 20 77 6F 72 6C 64 00 68 65 6C 6C 6F 20 77 6F 72 6C 64 8 ais@inf.uth.gr

int fd; char str[]="he wrd"; fd=pen("",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,str,5); write(fd,&str[5],6); write(fd," :-)",4); str h e 68 65 6C 6C 6F w r d \0 20 77 6F 72 6C 64 00 : - ) 20 3A 2D 29 /0 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 9 ais@inf.uth.gr

int fd; char str[]="he wrd"; fd=pen("",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,str,5); write(fd,&str[5],6); write(fd," :-)",4); str h e 68 65 6C 6C 6F w r d \0 20 77 6F 72 6C 64 00 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 10 ais@inf.uth.gr

seek(fd,(ff_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); write(fd,str,5); cse(fd); str h e 68 65 6C 6C 6F w r d \0 20 77 6F 72 6C 64 00 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 11 ais@inf.uth.gr

seek(fd,(ff_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); write(fd,str,5); cse(fd); str h e 68 65 6C 6C 6F w r d \0 20 77 6F 72 6C 64 00 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 12 ais@inf.uth.gr

seek(fd,(ff_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); write(fd,str,5); cse(fd); str h e 68 65 6C 6C 6F : - ) d \0 20 3A 2D 29 6C 64 00 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 13 ais@inf.uth.gr

seek(fd,(ff_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); write(fd,str,5); cse(fd); str h e 68 65 6C 6C 6F : - ) d \0 20 3A 2D 29 6C 64 00 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 14 ais@inf.uth.gr

seek(fd,(ff_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); write(fd,str,5); cse(fd); str h e 68 65 6C 6C 6F : - ) d \0 20 3A 2D 29 6C 64 00 fie psitin des NOT change! 68 65 6C 6C 6F 15 ais@inf.uth.gr

seek(fd,(ff_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); write(fd,str,5); cse(fd); str h e 68 65 6C 6C 6F : - ) d \0 20 3A 2D 29 6C 64 00 68 65 6C 6C 6F 00 00 00 00 00 00 00 00 00 00 68 65 6C 6C 6F binary zer vaues 16 ais@inf.uth.gr

seek(fd,(ff_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); write(fd,str,5); cse(fd); str h e 68 65 6C 6C 6F : - ) d \0 20 3A 2D 29 6C 64 00 68 65 6C 6C 6F 00 00 00 00 00 00 00 00 00 00 68 65 6C 6C 6F 17 ais@inf.uth.gr

Προσοχή! Οι read/write μπορεί να μην διαβάσουν/γράψουν όσα bytes ζήτησε ο προγραμματιστής αυτό δεν είναι (απαραίτητα) λάθος ή πρόβλημα Πρέπει να ελέγχεται η τιμή επιστροφής, και αν χρειαστεί να επαναληφθεί η κλήση ώστε να διαβαστούν/γραφτούν τα υπόλοιπα bytes Οι write/cse δεν δίνουν εγγυήσεις σχετικά με την αποθήκευση των δεδομένων στον δίσκο το λειτουργικό κρατά δεδομένα σε «κρυφή» μνήμη και τα αποθηκεύει στο δίσκο ασύγχρονα/αργότερα γιατί; Η σύγχρονη αποθήκευση δεδομένων στο μέσο αποθηκευσης (δίσκο) γίνεται με fsync 18 ais@inf.uth.gr

Απομάκρυνση αρχείου int unink(cnst char *path) καταργεί τον σύνδεσμο στο αρχείο Αν δεν υπάρχει άλλος σύνδεσμος σε αυτό το αρχείο, το αρχείο καθίσταται απροσπέλαστο και διαγράφεται όταν κλείσει και ο τελευταίος περιγραφέας σε αυτό Δημιουργία προσωρινού αρχείου που διαγράφεται όταν το πρόγραμμα τερματιστεί ή κλείσει τον περιγραφέα fd = pen("tmp",o_rdwr O_CREAT O_EXCL,0077); unink("tmp"); cse(fd); 19 ais@inf.uth.gr

Καθιερωμένοι περιγραφείς αρχείων Υπάρχουν 3 συγκεκριμένοι περιγραφείς αρχείων, που έχουν καθιερωμένη/προκαθορισμένη χρήση Καθιερωμένη είσοδος (standard input) STDIN_FILENO (0) Καθιερωμένη έξοδος (standard utput) STDOUT_FILENO (1) Καθιερωμένη έξοδος λαθών (standard errr) STDERR_FILENO (2) Αντιστοιχούν (συνήθως) στην «συσκευή τερματικού» (tty) που χρησιμοποιεί ο χρήστης του προγράμματος 0 -> πληκτρολόγιο, 1,2 -> οθόνη αυτά δεν είναι αρχεία 20 ais@inf.uth.gr

Περιγραφείς Αρχείων (fie descriptrs) 21 ais@inf.uth.gr

Περιγραφέας αρχείου Όταν ανοίγεται ένα αρχείο, το λειτουργικό επιστρέφει έναν ακέραιο περιγραφέα (fie descriptr) μέσω του οποίου πραγματοποιούνται οι λειτουργίες πρόσβασης δίνεται ως παράμετρος στις read, write, cse, Ένα πρόγραμμα μπορεί να δημιουργεί/διατηρεί ξεχωριστούς περιγραφείς για το ίδιο αρχείο Κάθε περιγραφέας «έχει» την δική του θέση ανάγνωσης/εγγραφής πάνω στο αρχείο Λειτουργίες που εκτελούνται μέσω ενός περιγραφέα δεν επηρεάζουν την θέση ανάγνωση/εγγραφής των άλλων περιγραφέων 22 ais@inf.uth.gr

fd1 fd2 access structure perating system access structure 23 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT Ο_TRUNC,S_IRWXU); fd2=pen("",o_rdwr,0); write(fd1,"a bring ecture",16); write(fd2,"a superb",8); ftruncate(fd1,2); write(fd2,"ecture",7); cse(fd1); cse(fd2); 24 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT Ο_TRUNC,S_IRWXU); fd2=pen("",o_rdwr,0); write(fd1,"a bring ecture",16); write(fd2,"a superb",8); ftruncate(fd1,2); write(fd2,"ecture",7); cse(fd1); cse(fd2); fd1 25 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT Ο_TRUNC,S_IRWXU); fd2=pen("",o_rdwr,0); write(fd1,"a bring ecture",16); write(fd2,"a superb",8); ftruncate(fd1,2); write(fd2,"ecture",7); cse(fd1); cse(fd2); fd1 fd2 26 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT Ο_TRUNC,S_IRWXU); fd2=pen("",o_rdwr,0); write(fd1,"a bring ecture",16); write(fd2,"a superb",8); ftruncate(fd1,2); write(fd2,"ecture",7); cse(fd1); cse(fd2); fd2 fd1 a b r i n g e c t u r e για να είναι πιο ευανάγνωστες οι τιμές των bytes, εδώ παρουσιάζονται με ερμηνεία ASCII 27 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT Ο_TRUNC,S_IRWXU); fd2=pen("",o_rdwr,0); write(fd1,"a bring ecture",16); write(fd2,"a superb",8); ftruncate(fd1,2); write(fd2,"ecture",7); cse(fd1); cse(fd2); fd2 fd1 a s u p e r b e c t u r e 28 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT Ο_TRUNC,S_IRWXU); fd2=pen("",o_rdwr,0); write(fd1,"a bring ecture",16); write(fd2,"a superb",8); ftruncate(fd1,2); write(fd2,"ecture",7); cse(fd1); cse(fd2); fd2 fd1 a s u p e r b e c t u r e 29 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT Ο_TRUNC,S_IRWXU); fd2=pen("",o_rdwr,0); write(fd1,"a bring ecture",16); write(fd2,"a superb",8); ftruncate(fd1,2); write(fd2,"ecture",7); cse(fd1); cse(fd2); fd2 fd1 a 30 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT Ο_TRUNC,S_IRWXU); fd2=pen("",o_rdwr,0); write(fd1,"a bring ecture",16); write(fd2,"a superb",8); ftruncate(fd1,2); write(fd2,"ecture",7); cse(fd1); cse(fd2); fd2 fd1 a \0 \0 \0 \0 \0 \0 e c t u r e 31 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT Ο_TRUNC,S_IRWXU); fd2=pen("",o_rdwr,0); write(fd1,"a bring ecture",16); write(fd2,"a superb",8); ftruncate(fd1,2); write(fd2,"ecture",7); cse(fd1); cse(fd2); fd2 fd1 a \0 \0 \0 \0 \0 \0 e c t u r e 32 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT Ο_TRUNC,S_IRWXU); fd2=pen("",o_rdwr,0); write(fd1,"a bring ecture",16); write(fd2,"a superb",8); ftruncate(fd1,2); write(fd2,"ecture",7); cse(fd1); cse(fd2); fd2 a \0 \0 \0 \0 \0 \0 e c t u r e 33 ais@inf.uth.gr

Δομή πρόσβασης Όταν ανοίγει ένα αρχείο, το λειτουργικό δημιουργεί (εσωτερικά) μια ξεχωριστή δομή πρόσβασης Η δομή πρόσβασης περιέχει πληροφορία για το είδος πρόσβασης στο αρχείο (mde στην pen) καθώς και για την τρέχουσα θέση ανάγνωσης/εγγραφής Το λειτουργικό διατηρεί (εσωτερικά) έναν πίνακα από δείκτες στις δομές πρόσβασης που έχουν δημιουργηθεί στο πλαίσιο κάθε προγράμματος Ο πίνακας αυτός δεν είναι άμεσα προσπελάσιμος από τον κώδικα της εφαρμογής (επίπεδο χρήστη) 34 ais@inf.uth.gr

Τι είναι τελικά ο περιγραφέας αρχείου; Η θέση στον πίνακα όπου βρίσκεται ο δείκτης στην νέα δομή πρόσβασης που δημιουργήθηκε μέσω pen Είναι ένας «απλός» ακέραιος Στις λειτουργίες read, write, cse δεν πρέπει απαραίτητα να δοθεί μια τιμή που επέστρεψε η pen Μπορεί να δοθεί μια οποιαδήποτε τιμή ακεραίου με ευθύνη του προγραμματιστή π.χ., προκαθορισμένες τιμές 0,1,2 για stdin, stdut, stderr Θα χρησιμοποιηθεί η (όποια) δομή πρόσβασης «τυχαίνει» να βρίσκεται σε αυτή τη θέση του πίνακα 35 ais@inf.uth.gr

Κόμβος πληροφορίας i-nde Για κάθε ανοιχτό αρχείο, το λειτουργικό διατηρεί μια ξεχωριστή δομή (infrmatin nde) όπου αποθηκεύονται διάφορες πληροφορίες ιδιοκτήτης, ομάδα άδειες πρόσβασης μέγεθος, αριθμός μπλοκ αριθμός συσκευής που βρίσκεται το αρχείο χρονοσφραγίδα πρόσφατης πρόσβασης/αλλαγής δεδομένα που κρατιούνται προσωρινά στην μνήμη Για κάθε ανοιχτό αρχείο, υπάρχει μόνο ένα i-nde, στο οποίο συνδέονται όλες οι δομές πρόσβασης Το i-nde μπορεί να προσπελαστεί μέσω των λειτουργιών stat, stat, fstat 36 ais@inf.uth.gr

0 1 2 3 4 free sts fie descriptr tabe access structure i-nde i-nde access structure fie1 fie2 37 ais@inf.uth.gr

0 1 2 3 4 free sts fie descriptr tabe access structure i-nde access structure fie 38 ais@inf.uth.gr

Αντιγραφή περιγραφέων αρχείων & Ανακατεύθυνση EE 39 ais@inf.uth.gr

Αντίγραφα περιγραφέων int dup(int fd): δημιουργεί ένα αντίγραφο του περιγραφέα fd, που δείχνει στην ίδια δομή πρόσβασης, και επιστρέφει την θέση του νέου περιγραφέα στον πίνακα των δομών πρόσβασης int dup2(int fd, int id): δημιουργεί ένα αντίγραφο του fd, στην θέση id του πίνακα αν στην θέση id ήδη υπάρχει δείκτης σε κάποια άλλη δομή πρόσβασης, γίνεται αντικατάσταση Τα αντίγραφα δείχνουν στην ίδια δομή πρόσβασης έχουν την ίδια θέση ανάγνωσης/εγγραφής 40 ais@inf.uth.gr

3 4 fie descriptr tabe access structure access structure device/fie device/fie 41 ais@inf.uth.gr

3 4 5 next free st fie descriptr tabe dup(3); access structure access structure device/fie device/fie 42 ais@inf.uth.gr

3 4 5 fie descriptr tabe access structure access structure device/fie device/fie 43 ais@inf.uth.gr

3 4 5 fie descriptr tabe dup2(4,3); access structure access structure device/fie device/fie 44 ais@inf.uth.gr

3 4 5 fie descriptr tabe access structure access structure device/fie device/fie 45 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); fd2=dup(fd1); write(fd1,"have a nice",11); write(fd2," day",4); cse(fd1); cse(fd2); 46 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); fd2=dup(fd1); write(fd1,"have a nice",11); write(fd2," day",4); cse(fd1); cse(fd2); fd1 47 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); fd2=dup(fd1); write(fd1,"have a nice",11); write(fd2," day",4); cse(fd1); cse(fd2); fd1,fd2 48 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); fd2=dup(fd1); write(fd1,"have a nice",11); write(fd2," day",4); cse(fd1); cse(fd2); fd1,fd2 h a v e a n i c e 49 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); fd2=dup(fd1); write(fd1,"have a nice",11); write(fd2," day",4); cse(fd1); cse(fd2); fd1,fd2 h a v e a n i c e d a y 50 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); fd2=dup(fd1); write(fd1,"have a nice",11); write(fd2," day",4); cse(fd1); cse(fd2); fd1,fd2 h a v e a n i c e d a y 51 ais@inf.uth.gr

int fd1,fd2; fd1=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); fd2=dup(fd1); write(fd1,"have a nice",11); write(fd2," day",4); cse(fd1); cse(fd2); fd2 h a v e a n i c e d a y 52 ais@inf.uth.gr

Είσοδος-έξοδος προγράμματος Κατά σύμβαση, οι θέσεις 0, 1 και 2 του πίνακα δομών πρόσβασης παίζουν ξεχωριστό ρόλο καθιερωμένη είσοδος, έξοδος, έξοδος λαθών Αρχικά, στις θέσεις αυτές αποθηκεύονται δομές πρόσβασης για την τερματική συσκευή μέσω της οποίας γίνεται η αλληλεπίδραση με τον χρήστη 0 = είσοδος τερματικού = πληκτρολόγιο 1,2 = έξοδος τερματικού = οθόνη Οι αντίστοιχες δομές πρόσβασης δημιουργούνται από το λειτουργικό / περιβάλλον εκτέλεσης, χωρίς να πρέπει να γραφτεί/εκτελεστεί κώδικας εφαρμογής 53 ais@inf.uth.gr

0 1 2 fie descriptr tabe access structure access structure 54 ais@inf.uth.gr

0 1 2 scanf(...); fie descriptr tabe read(0,...); access structure access structure 55 ais@inf.uth.gr

0 1 2 printf(...); fie descriptr tabe write(1,...); access structure access structure 56 ais@inf.uth.gr

Ανακατεύθυνση εισόδου/εξόδου Η είσοδος/έξοδος ενός προγράμματος δεν είναι παγιωμένη στην τερματική συσκευή του χρήστη Αυτό που είναι παγιωμένο (καθαρά ως σύμβαση) είναι ο ρόλος των δομών πρόσβασης που «τυχαίνει» να βρίσκονται στις θέσεις 0, 1, 2 Μπορεί να γίνει αντικατάσταση των δομών πρόσβασης που βρίσκονται σε αυτές τις θέσεις με dup2, κατά την διάρκεια της εκτέλεσης οι νέες δομές πρόσβασης πρέπει να έχουν ανοίξει για διάβασμα και γράψιμο, αντίστοιχα Αυτό γίνεται εν αγνοία του όποιου κώδικα έχει ήδη γραφτεί να χρησιμοποιεί τους περιγραφείς 0, 1, 2 π.χ., μέσα από κλήσεις των scanf/printf 57 ais@inf.uth.gr

0 1 2 3 printf(...); fie descriptr tabe write(1,...); access structure access structure access structure 58 ais@inf.uth.gr

0 1 2 3 fie descriptr tabe dup2(3,1); access structure access structure access structure 59 ais@inf.uth.gr

0 1 2 3 printf(...); fie descriptr tabe write(1,...); access structure access structure access structure 60 ais@inf.uth.gr

0 1 2 3 scanf(...); fie descriptr tabe read(0,...); access structure access structure access structure 61 ais@inf.uth.gr

0 1 2 3 fie descriptr tabe dup2(3,0); access structure access structure access structure 62 ais@inf.uth.gr

0 1 2 3 scanf(...); fie descriptr tabe read(0,...); access structure access structure access structure 63 ais@inf.uth.gr

int fd, dut, din; char buf[16]; fd=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); printf("he wrd\n"); dut = dup(stdout_fileno); // cpy stdut dup2(fd,stdout_fileno); // redirect stdut t fd printf("he wrd again\n"); dup2(dut,stdout_fileno); // restre stdut 0 1 64 ais@inf.uth.gr

int fd, dut, din; char buf[16]; fd=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); printf("he wrd\n"); dut = dup(stdout_fileno); // cpy stdut dup2(fd,stdout_fileno); // redirect stdut t fd printf("he wrd again\n"); dup2(dut,stdout_fileno); // restre stdut fd 0 1 65 ais@inf.uth.gr

int fd, dut, din; char buf[16]; fd=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); printf("he wrd\n"); dut = dup(stdout_fileno); // cpy stdut dup2(fd,stdout_fileno); // redirect stdut t fd printf("he wrd again\n"); dup2(dut,stdout_fileno); // restre stdut h e w r d \n fd 0 1 66 ais@inf.uth.gr

int fd, dut, din; char buf[16]; fd=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); printf("he wrd\n"); dut = dup(stdout_fileno); // cpy stdut dup2(fd,stdout_fileno); // redirect stdut t fd printf("he wrd again\n"); dup2(dut,stdout_fileno); // restre stdut dut fd 0 1 67 ais@inf.uth.gr

int fd, dut, din; char buf[16]; fd=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); printf("he wrd\n"); dut = dup(stdout_fileno); // cpy stdut dup2(fd,stdout_fileno); // redirect stdut t fd printf("he wrd again\n"); dup2(dut,stdout_fileno); // restre stdut dut fd 0 1 68 ais@inf.uth.gr

int fd, dut, din; char buf[16]; fd=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); printf("he wrd\n"); dut = dup(stdout_fileno); // cpy stdut dup2(fd,stdout_fileno); // redirect stdut t fd printf("he wrd again\n"); dup2(dut,stdout_fileno); // restre stdut dut 0 1 fd h e w r d a g a i n \n 69 ais@inf.uth.gr

int fd, dut, din; char buf[16]; fd=pen("",o_rdwr Ο_CREAT O_TRUNC,S_IRWXU); printf("he wrd\n"); dut = dup(stdout_fileno); // cpy stdut dup2(fd,stdout_fileno); // redirect stdut t fd printf("he wrd again\n"); dup2(dut,stdout_fileno); // restre stdut dut 0 1 fd h e w r d a g a i n \n 70 ais@inf.uth.gr

printf("hi\n"); scanf("%s",buf); printf("%s\n",buf); seek(fd,12,seek_set); din = dup(stdin_fileno); // cpy stdin dup2(fd,stdin_fileno); // redirect stdin t fd scanf("%s",buf); printf("%s\n",buf); dup2(din,stdin_fileno); // restre stdin cse(fd); cse(dut); cse(din); 0 dut 1 h i \n fd h e w r d a g a i n \n 71 ais@inf.uth.gr

printf("hi\n"); scanf("%s",buf); printf("%s\n",buf); seek(fd,12,seek_set); din = dup(stdin_fileno); // cpy stdin dup2(fd,stdin_fileno); // redirect stdin t fd scanf("%s",buf); printf("%s\n",buf); dup2(din,stdin_fileno); // restre stdin cse(fd); cse(dut); cse(din); h e dut \n h e \n 0 1 fd h e w r d a g a i n \n 72 ais@inf.uth.gr

printf("hi\n"); scanf("%s",buf); printf("%s\n",buf); seek(fd,12,seek_set); din = dup(stdin_fileno); // cpy stdin dup2(fd,stdin_fileno); // redirect stdin t fd scanf("%s",buf); printf("%s\n",buf); dup2(din,stdin_fileno); // restre stdin cse(fd); cse(dut); cse(din); dut 0 1 fd h e w r d a g a i n \n 73 ais@inf.uth.gr

printf("hi\n"); scanf("%s",buf); printf("%s\n",buf); seek(fd,12,seek_set); din = dup(stdin_fileno); // cpy stdin dup2(fd,stdin_fileno); // redirect stdin t fd scanf("%s",buf); printf("%s\n",buf); dup2(din,stdin_fileno); // restre stdin cse(fd); cse(dut); cse(din); din 0 dut 1 fd h e w r d a g a i n \n 74 ais@inf.uth.gr

printf("hi\n"); scanf("%s",buf); printf("%s\n",buf); seek(fd,12,seek_set); din = dup(stdin_fileno); // cpy stdin dup2(fd,stdin_fileno); // redirect stdin t fd scanf("%s",buf); printf("%s\n",buf); dup2(din,stdin_fileno); // restre stdin cse(fd); cse(dut); cse(din); din 0 dut 1 fd h e w r d a g a i n \n 75 ais@inf.uth.gr

printf("hi\n"); scanf("%s",buf); printf("%s\n",buf); seek(fd,12,seek_set); din = dup(stdin_fileno); // cpy stdin dup2(fd,stdin_fileno); // redirect stdin t fd scanf("%s",buf); printf("%s\n",buf); dup2(din,stdin_fileno); // restre stdin cse(fd); cse(dut); cse(din); din 0 dut 1 a g a i n \n fd h e w r d a g a i n \n 76 ais@inf.uth.gr

printf("hi\n"); scanf("%s",buf); printf("%s\n",buf); seek(fd,12,seek_set); din = dup(stdin_fileno); // cpy stdin dup2(fd,stdin_fileno); // redirect stdin t fd scanf("%s",buf); printf("%s\n",buf); dup2(din,stdin_fileno); // restre stdin cse(fd); cse(dut); cse(din); din 0 dut 1 fd h e w r d a g a i n \n 77 ais@inf.uth.gr

printf("hi\n"); scanf("%s",buf); printf("%s\n",buf); seek(fd,12,seek_set); din = dup(stdin_fileno); // cpy stdin dup2(fd,stdin_fileno); // redirect stdin t fd scanf("%s",buf); printf("%s\n",buf); dup2(din,stdin_fileno); // restre stdin cse(fd); cse(dut); cse(din); din 0 dut 1 fd h e w r d a g a i n \n 78 ais@inf.uth.gr

printf("hi\n"); scanf("%s",buf); printf("%s\n",buf); seek(fd,12,seek_set); din = dup(stdin_fileno); // cpy stdin dup2(fd,stdin_fileno); // redirect stdin t fd scanf("%s",buf); printf("%s\n",buf); dup2(din,stdin_fileno); // restre stdin cse(fd); cse(dut); cse(din); din 0 dut 1 h e w r d a g a i n \n 79 ais@inf.uth.gr

printf("hi\n"); scanf("%s",buf); printf("%s\n",buf); seek(fd,12,seek_set); din = dup(stdin_fileno); // cpy stdin dup2(fd,stdin_fileno); // redirect stdin t fd scanf("%s",buf); printf("%s\n",buf); dup2(din,stdin_fileno); // restre stdin cse(fd); cse(dut); cse(din); din 0 1 h e w r d a g a i n \n 80 ais@inf.uth.gr

printf("hi\n"); scanf("%s",buf); printf("%s\n",buf); seek(fd,12,seek_set); din = dup(stdin_fileno); // cpy stdin dup2(fd,stdin_fileno); // redirect stdin t fd scanf("%s",buf); printf("%s\n",buf); dup2(din,stdin_fileno); // restre stdin cse(fd); cse(dut); cse(din); 0 1 h e w r d a g a i n \n 81 ais@inf.uth.gr

Ανακατεύθυνση και stdi Η χρήση της stdi με ανακατεύθυνση της εισόδου/εξόδου σε αρχεία δεν είναι εντελώς διαφανής Αν η stdi χρησιμοποιηθεί σε πρώτη φάση με την καθιερωμένη είσοδο/έξοδο να δείχνει στην συσκευή τερματικού, η πολιτική είναι ine buffered ακόμα και αν ακολουθήσει ανακατεύθυνση σε αρχείο Αν η stdi χρησιμοποιηθεί σε πρώτη φάση με την καθιερωμένη είσοδο/έξοδο να δείχνει ήδη σε αρχεία, η πολιτική είναι fuy buffered για να γραφτούν δεδομένα στο αρχείο πρέπει να ζητηθεί ρητά το άδειασμα της ενδιάμεσης αποθήκης με ffush 82 ais@inf.uth.gr

int fd; fuy buffered fd=pen("",o_wronly O_CREAT O_TRUNC,S_IRWXU); dup2(fd,stdout_fileno); /* redirect stdut t fd */ printf("he wrd\n"); int fd; ine buffered printf("smething t set picy t ine-buffered\n"); fd=pen("",o_wronly O_CREAT O_TRUNC,S_IRWXU); dup2(fd,stdout_fileno); /* redirect stdut t fd */ printf("he wrd\n"); 83 ais@inf.uth.gr