Αρχεία Προγραμματισμός II 1 ais@inf.uth.gr
Αποθήκευση δεδομένων Οι μεταβλητές και δομές δεδομένων ενός προγράμματος υπάρχουν στην μνήμη του Η/Υ Χάνονται όταν τερματιστεί το πρόγραμμα ή σβήσει ο Η/Υ (πιθανώς λόγω βλάβης) Χρειαζόμαστε μόνιμα αποθηκευτικά μέσα που λειτουργούν χωρίς παροχή ρεύματος μαγνητικά, οπτικά, soid-state, Σημείωση: και ο ίδιος ο κώδικας (sources, binaries) είναι δεδομένα που δεν σίγουρα θέλουμε να χάνονται κάθε φορά που σβήνουμε τον υπολογιστή Προγραμματισμός II 2 ais@inf.uth.gr
Πρόσβαση μέσων αποθήκευσης Η πρόσβαση στα μόνιμα αποθηκευτικά μέσα είναι μια σχετικά περίπλοκη υπόθεση καμία σχέση με το απλό μοντέλο της κυρίως μνήμης κάθε τεχνολογία έχει τις ιδιαιτερότητες της, και κάθε συσκευή μπορεί να απαιτεί διαφορετική διαχείριση Χρειάζεται ένα γενικό μοντέλο πρόσβασης ανεξάρτητου της τεχνολογίας που χρησιμοποιείται για την υλοποίηση μιας αποθηκευτικής συσκευής Επίσης χρειάζεται ελεγχόμενη πρόσβαση στις συσκευές αποθήκευσης, ώστε να παρέχεται προστασία/ασφάλεια των δεδομένων Προγραμματισμός II 3 ais@inf.uth.gr
Appications API κατάλληλη αφαίρεση; Προγραμματισμός II 4 ais@inf.uth.gr
Αρχεία Ξεχωριστές οντότητες αποθήκευσης δεδομένων Τα αρχεία είναι μόνιμα: εξακολουθούν να υφίστανται ακόμα και μετά τον τερματισμό των προγραμμάτων που τα δημιούργησαν/επεξεργάστηκαν συχνά, επιζούν πολύ παραπάνω και από τους υπολογιστές και τα προγράμματα μέσω των οποίων δημιουργήθηκαν Τα αρχεία είναι επώνυμα: κάθε αρχείο έχει ένα «μοναδικό» όνομα/αναγνωριστικό ώστε να μπορεί να εντοπιστεί αργότερα, είτε από το πρόγραμμα που το δημιούργησε είτε από άλλα προγράμματα Προγραμματισμός II 5 ais@inf.uth.gr
Χώρος ονομάτων Τα ονόματα αρχείων δίνονται στο πλαίσιο ενός «χώρου ονομάτων» του συστήματος Ο χώρος είναι δομημένος ιεραρχικά διευκολύνει την ανάθεση μοναδικών ονομάτων διευκολύνει την διαχείριση πολλών αρχείων διευκολύνει τον έλεγχο πρόσβασης Κάθε επίπεδο ονομάζεται κατάλογος (directory) Η δομή αναπαρίσταται ως «ανεστραμμένο» δέντρο Η ρίζα (root) είναι στο ψηλότερο επίπεδο και αποτελεί την κορυφή της ιεραρχίας καταλόγων Προγραμματισμός II 6 ais@inf.uth.gr
/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf Προγραμματισμός II 7 ais@inf.uth.gr
Προσδιορισμός ονομάτων Απόλυτος προσδιορισμός, σε καθολικό επίπεδο πλήρες όνομα, με βάση την κορυφή της ιεραρχίας Σχετικός προσδιορισμός, σε τοπικό επίπεδο τμήμα ονόματος, με βάση τον κατάλογο εργασίας Συμβάσεις "." για τον τρέχοντα κατάλογο εργασίας ".." για τον κατάλογο που βρίσκεται ένα επίπεδο ψηλότερα από τον τρέχοντα κατάλογο εργασίας "/" για την ρίζα του δέντρου, αλλά και ως διαχωριστικό ανάμεσα στα ονόματα καταλόγων/αρχείων ενός μονοπατιού Προγραμματισμός II 8 ais@inf.uth.gr
/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα: a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 9 ais@inf.uth.gr
/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα: progii/a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 10 ais@inf.uth.gr
/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα: progii/a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 11 ais@inf.uth.gr
/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα: /users/profs/ais/progii/a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 12 ais@inf.uth.gr
/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα: /users/profs/ais/progii/a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 13 ais@inf.uth.gr
/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα:../progii/a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 14 ais@inf.uth.gr
/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα:../../grads/emkouts/progii/a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 15 ais@inf.uth.gr
Προστασία αρχείων / καταλόγων Για κάθε αρχείο / κατάλογο το λειτουργικό διατηρεί πληροφορία για τον ιδιοκτήτη του, καθώς και για τις άδειες πρόσβασης σε αυτό Υποκείμενα: user, group, others Ξεχωριστές άδειες για κάθε υποκείμενο Όταν ένα πρόγραμμα επιχειρεί να προσπελάσει ένα αρχείο, το λειτουργικό ελέγχει την άδεια πρόσβασης αν ο χρήστης στο όνομα του οποίου εκτελείται το πρόγραμμα δεν έχει άδεια να προσπελάσει το αρχείο με τον ζητούμενο τρόπο, η λειτουργία δεν εκτελείται Αλλαγές ιδιοκτησίας γίνονται μέσω chown / fchown Αλλαγές αδειών γίνονται μέσω chmod / fchmod Προγραμματισμός II 16 ais@inf.uth.gr
Προσδιορισμός αδειών με chmod Προσδιορισμός υποκειμένων u(ser) χρήστης/ιδιοκτήτης g(group) ομάδα o(thers) άλλοι a() όλοι Προσδιορισμός άδειας r(ead) ανάγνωση w(rite) γράψιμο/αλλαγή (e)x(ecute) εκτέλεση chmod u+rwx fiename chmod o+rx,o-w fiename Προγραμματισμός II 17 ais@inf.uth.gr
Οκταδική κωδικοποίηση αδειών read (octa 4) write (octa 2) execute (octa 1) 1 0 0 0 1 0 0 0 1 Προσδιορισμός άδειας 4 ανάγνωση 2 γράψιμο/αλλαγή 1 εκτέλεση 7 ανάγνωση-γράψιμο-εκτέλεση Ξεχωριστά οκταδικά ψηφία για χρήστη-ομάδα-άλλους με αυτή την σειρά Πιο εύκολη προσθαφαίρεση αδειών chmod 755 fiename Προγραμματισμός II 18 ais@inf.uth.gr
Περιορισμός αδειών μέσω umask Ο χρήστης μπορεί να μπλοκάρει συγκεκριμένες άδειες για τα αρχεία που δημιουργούνται από τα προγράμματα που εκτελεί, μέσω της μάσκας umask Η μάσκα ορίζεται μέσω της εντολής/λειτουργίας umask Κατά την εκτέλεση, γίνεται συνδυασμός των αδειών perms που δίνει ένα πρόγραμμα (μέσω της λειτουργίας open) με την μάσκα προστασίας του χρήστη perms & ~umask umask=077 μπλοκάρει όλες τις άδειες για g+o umask=022 μπλοκάρει την άδεια γραψίματος για g+o Προγραμματισμός II 19 ais@inf.uth.gr
Γράψιμο/διάβασμα δεδομένων σε/από αρχείο Τα bytes γράφονται/διαβάζονται σειριακά Η θέση εγγραφής/ανάγνωσης του αρχείου αυξάνεται αυτόματα όταν γράφονται/διαβάζονται bytes Η θέση εγγραφής/ανάγνωσης μπορεί να αλλάξει (προς τα εμπρός ή πίσω) και με ρητό/άμεσο τρόπο Το αρχείο επεκτείνεται/μεγαλώνει αυτόματα, όταν γράφονται bytes πέρα από το τέλος του Το αρχείο μπορεί να συρρικνωθεί/κοπεί, από το τέλος προς την αρχή αυτό πρέπει να γίνει ρητά δεν υπάρχει λειτουργία για το σβήσιμο/αποκοπή περιεχομένων από την αρχή ή το μέσο του αρχείου Προγραμματισμός II 20 ais@inf.uth.gr
πρώτο byte θέση ανάγνωσης/εγγραφής τελευταίο byte περιεχόμενα αρχείου Προγραμματισμός II 21 ais@inf.uth.gr
Βασικές λειτουργίες (1) int open(const char *path, int fags, mode_t perms) ανοίγει το αρχείο με όνομα path (αν αυτό συμπεριλαμβάνει ένα μονοπάτι καταλόγων, αυτό πρέπει ήδη να υφίσταται) Η επιθυμητή πρόσβαση στο αρχείο δίνεται μέσω fags Ο_RDONLY,Ο_WRONLY,Ο_RDWR: διάβασμα, γράψιμο, και τα δύο Ο_APPEND,Ο_TRUNC: προσθήκη στο τέλος, κόψιμο αρχείου Ο_CREAT: δημιουργία αρχείου, αν δεν υπάρχει ήδη Ο_EXCL: μαζί με Ο_CREAT, αποτυχία αν το αρχείο υπάρχει Οι άδειες πρόσβασης του αρχείου δίνονται μέσω perms οκταδική τιμή (π.χ. 0700) ή συμβολική σταθερά (π.χ. S_IRWXU) λαμβάνονται υπόψη μόνο όταν δημιουργείται ένα νέο αρχείο Προγραμματισμός II 22 ais@inf.uth.gr
Περιγραφείς αρχείων (fie descriptors) Σε περίπτωση επιτυχίας, η open επιστρέφει έναν «περιγραφέα αρχείου» (fie descriptor) Οι περιγραφείς αρχείων είναι «απλοί» ακέραιοι δεν υπάρχει ειδικός τύπος δεδομένων για αρχεία Ο περιγραφέας αρχείου που επιστρέφεται χρησιμοποιείται ως αναφορά (reference) για το αρχείο Όλες οι βασικές λειτουργίες αρχείων δέχονται ως παράμετρο έναν περιγραφέα αρχείου μια ακέραια τιμή που επέστρεψε η open Περισσότερα για τους περιγραφείς αρχείων, αργότερα Προγραμματισμός II 23 ais@inf.uth.gr
Βασικές λειτουργίες (2) ssize_t read(int fd, void *buf, size_t n) ανάγνωση δεδομένων από το αρχείο ssize_t write(int fd, void *buf, size_t n) εγγραφή δεδομένων στο αρχείο off_t seek(int fd, off_t pos, int whence) μετακίνηση θέσης ανάγνωσης/εγγραφής int ftruncate(int fd, off_t ength) κόψιμο/επέκταση του αρχείου int fsync(int fd) σύγχρονη αποθήκευση δεδομένων στον δίσκο int cose(int fd) κλείσιμο του περιγραφέα αρχείου Προγραμματισμός II 24 ais@inf.uth.gr
int fd; char str[]="heo word"; fd=open("test",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 o 6F w o r d \0 20 77 6F 72 6C 64 00 Προγραμματισμός II 25 ais@inf.uth.gr
int fd; char str[]="heo word"; fd=open("test",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 o 6F w o r d \0 20 77 6F 72 6C 64 00 test Προγραμματισμός II 26 ais@inf.uth.gr
int fd; char str[]="heo word"; fd=open("test",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 o 6F w o r d \0 20 77 6F 72 6C 64 00 test 68 65 6C 6C 6F Προγραμματισμός II 27 ais@inf.uth.gr
int fd; char str[]="heo word"; fd=open("test",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 o 6F w o r d \0 20 77 6F 72 6C 64 00 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 Προγραμματισμός II 28 ais@inf.uth.gr
int fd; char str[]="heo word"; fd=open("test",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 o 6F w o r d \0 20 77 6F 72 6C 64 00 : - ) 20 3A 2D 29 /0 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 Προγραμματισμός II 29 ais@inf.uth.gr
int fd; char str[]="heo word"; fd=open("test",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 o 6F w o r d \0 20 77 6F 72 6C 64 00 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 Προγραμματισμός II 30 ais@inf.uth.gr
seek(fd,(off_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); seek(fd,4,seek_end); write(fd,str,5); cose(fd); str h e 68 65 6C 6C o 6F w o r d \0 20 77 6F 72 6C 64 00 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 Προγραμματισμός II 31 ais@inf.uth.gr
seek(fd,(off_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); seek(fd,4,seek_end); write(fd,str,5); cose(fd); str h e 68 65 6C 6C o 6F w o r d \0 20 77 6F 72 6C 64 00 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 Προγραμματισμός II 32 ais@inf.uth.gr
seek(fd,(off_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); seek(fd,4,seek_end); write(fd,str,5); cose(fd); str h e 68 65 6C 6C o 6F : - ) d \0 20 3A 2D 29 6C 64 00 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 Προγραμματισμός II 33 ais@inf.uth.gr
seek(fd,(off_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); seek(fd,4,seek_end); write(fd,str,5); cose(fd); str h e 68 65 6C 6C o 6F : - ) d \0 20 3A 2D 29 6C 64 00 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 Προγραμματισμός II 34 ais@inf.uth.gr
seek(fd,(off_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); seek(fd,4,seek_end); write(fd,str,5); cose(fd); str h e 68 65 6C 6C o 6F : - ) d \0 20 3A 2D 29 6C 64 00 test 68 65 6C 6C 6F Προγραμματισμός II 35 ais@inf.uth.gr
seek(fd,(off_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); seek(fd,4,seek_end); write(fd,str,5); cose(fd); str h e 68 65 6C 6C o 6F : - ) d \0 20 3A 2D 29 6C 64 00 test 68 65 6C 6C 6F Προγραμματισμός II 36 ais@inf.uth.gr
seek(fd,(off_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); seek(fd,4,seek_end); write(fd,str,5); cose(fd); str h e 68 65 6C 6C o 6F : - ) d \0 20 3A 2D 29 6C 64 00 test 68 65 6C 6C 6F 00 00 00 00 68 65 6C 6C 6F Προγραμματισμός II 37 ais@inf.uth.gr
seek(fd,(off_t)-3,seek_cur); read(fd,&str[6],3); ftruncate(fd,5); seek(fd,4,seek_end); write(fd,str,5); cose(fd); str h e 68 65 6C 6C o 6F : - ) d \0 20 3A 2D 29 6C 64 00 test 68 65 6C 6C 6F 00 00 00 00 68 65 6C 6C 6F Προγραμματισμός II 38 ais@inf.uth.gr
Προσοχή! Η read/write μπορεί να μην διαβάσει/γράψει όσα bytes ζήτησε ο προγραμματιστής αυτό δεν είναι (απαραίτητα) λάθος ή πρόβλημα Πρέπει να ελέγχεται η τιμή επιστροφής, και αν χρειαστεί να επαναληφθεί η κλήση ώστε να διαβαστούν/γραφτούν τα υπόλοιπα bytes Η write/cose δεν δίνει κάποιες εγγυήσεις σχετικά με την μονιμοποίηση/αποθήκευση των δεδομένων στον δίσκο το λειτουργικό κρατά δεδομένα σε «κρυφή» μνήμη και τα αποθηκεύει στο δίσκο ασύγχρονα/αργότερα γιατί; Η σύγχρονη αποθήκευση γίνεται με fsync Προγραμματισμός II 39 ais@inf.uth.gr
Ερμηνεία περιεχομένων ενός αρχείου Το λειτουργικό σύστημα διαβάζει/γράφει bytes από/σε αρχεία χωρίς να τα ερμηνεύει Η σημασία/ερμηνεία των περιεχομένων ενός αρχείου είναι θέμα της εφαρμογής/χρήστη Χρειάζονται κατάλληλες συμβάσεις/πρότυπα κωδικοποίησης/ερμηνείας των δεδομένων Η τιμή ενός ή πολλών bytes μπορεί να ερμηνευθεί με πολλούς διαφορετικούς τρόπους Text fie: το περιεχόμενο του αρχείου πρέπει να ερμηνευθεί χρησιμοποιώντας την σύμβαση ASCII Binary fie: ένα αρχείο που δεν είναι (μόνο) text Προγραμματισμός II 40 ais@inf.uth.gr
Προγραμματισμός II 41 ais@inf.uth.gr
Ερμηνεία δυαδικών δεδομένων τιμές σε hex 48 49 00 ascii '0' '1' ascii string '01' 0049 itte-endian short (2B) Προγραμματισμός II 42 ais@inf.uth.gr
int fd,va=0x21776f77; char str[sizeof(int)+1]; fd=open("test",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,&va,sizeof(int)); seek(fd,0,seek_set); read(fd,str,sizeof(int)); str[sizeof(int)]='\0'; cose(fd); itte endian va 77 6F 77 21???? str? address space Προγραμματισμός II 43 ais@inf.uth.gr
int fd,va=0x21776f77; char str[sizeof(int)+1]; fd=open("test",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,&va,sizeof(int)); seek(fd,0,seek_set); read(fd,str,sizeof(int)); str[sizeof(int)]='\0'; cose(fd); va 77 6F 77 21 str????? test Προγραμματισμός II 44 ais@inf.uth.gr
int fd,va=0x21776f77; char str[sizeof(int)+1]; fd=open("test",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,&va,sizeof(int)); seek(fd,0,seek_set); read(fd,str,sizeof(int)); str[sizeof(int)]='\0'; cose(fd); va 77 6F 77 21 str????? test 77 6F 77 21 Προγραμματισμός II 45 ais@inf.uth.gr
int fd,va=0x21776f77; char str[sizeof(int)+1]; fd=open("test",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,&va,sizeof(int)); seek(fd,0,seek_set); read(fd,str,sizeof(int)); str[sizeof(int)]='\0'; cose(fd); va 77 6F 77 21 str????? test 77 6F 77 21 Προγραμματισμός II 46 ais@inf.uth.gr
int fd,va=0x21776f77; char str[sizeof(int)+1]; fd=open("test",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,&va,sizeof(int)); seek(fd,0,seek_set); read(fd,str,sizeof(int)); str[sizeof(int)]='\0'; cose(fd); va 77 6F 77 21 w o w!? 77 6F 77 21 str? test 77 6F 77 21 Προγραμματισμός II 47 ais@inf.uth.gr
int fd,va=0x21776f77; char str[sizeof(int)+1]; fd=open("test",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,&va,sizeof(int)); seek(fd,0,seek_set); read(fd,str,sizeof(int)); str[sizeof(int)]='\0'; cose(fd); w o w! \0 va 77 6F 77 21 str 77 6F 77 21 00 test 77 6F 77 21 Προγραμματισμός II 48 ais@inf.uth.gr
int fd,va=0x21776f77; char str[sizeof(int)+1]; fd=open("test",o_rdwr O_CREAT O_TRUNC,S_IRWXU); write(fd,&va,sizeof(int)); seek(fd,0,seek_set); read(fd,str,sizeof(int)); str[sizeof(int)]='\0'; cose(fd); w o w! \0 va 77 6F 77 21 str 77 6F 77 21 00 test 77 6F 77 21 Προγραμματισμός II 49 ais@inf.uth.gr
«Τύποι» αρχείων Το λειτουργικό δεν διατηρεί πληροφορία τύπου για τα αρχεία που δημιουργούν τα προγράμματα ούτε ενδιαφέρεται / επιχειρεί να ερμηνεύσει τα περιεχόμενα Πληροφορία για τον «τύπο» ενός αρχείου προτίθεται, συνήθως κωδικοποιημένη στα περιεχόμενα του, από το πρόγραμμα που δημιουργεί το αρχείο Οι καταλήξεις αρχείων (π.χ.,.pdf) είναι απλά μια σύμβαση για πιο εύκολη αναζήτηση από τον χρήστη αυτή η σύμβαση είναι σε πιο ψηλό επίπεδο από το ΛΣ είναι μόνο ενδεικτική για τα περιεχόμενα του αρχείου (αν ένα αρχείο ονομάζεται.pdf δεν σημαίνει ότι *είναι* pdf) Προγραμματισμός II 50 ais@inf.uth.gr
Απομάκρυνση αρχείου int unink(const char *path) καταργεί τον σύνδεσμο στο αρχείο Αν δεν υπάρχει άλλος σύνδεσμος σε αυτό το αρχείο, το αρχείο καθίσταται απροσπέλαστο και διαγράφεται όταν κλείσει και ο τελευταίος περιγραφέας σε αυτό Δημιουργία «προσωρινού» αρχείου που διαγράφεται όταν το πρόγραμμα τερματιστεί ή κλείσει τον περιγραφέα fd = open("tmp",o_rdwr O_CREAT O_EXCL,0077); unink("tmp"); cose(fd); Προγραμματισμός II 51 ais@inf.uth.gr
Καθιερωμένοι περιγραφείς αρχείων Υπάρχουν 3 συγκεκριμένοι περιγραφείς αρχείων, που έχουν καθιερωμένη/προκαθορισμένη χρήση Καθιερωμένη είσοδος (standard input) STDIN_FILENO (0) Καθιερωμένη έξοδος (standard output) STDOUT_FILENO (1) Καθιερωμένη έξοδος λαθών (standard error) STDERR_FILENO (2) Αντιστοιχούν (συνήθως) στην «συσκευή τερματικού» (tty) που χρησιμοποιεί ο χρήστης του προγράμματος 0 -> πληκτρολόγιο, 1,2 -> οθόνη όμως αυτά δεν είναι (πραγματικά) αρχεία Προγραμματισμός II 52 ais@inf.uth.gr