Λειτουργία ανάγνωσης POSIX στον προγραμματισμό C

Posix Read Function C Programing



Στα παραδοσιακά συμβατά λειτουργικά συστήματα POSIX, για να λάβετε πληροφορίες από ένα έγγραφο που περιέχεται σε ένα σύστημα αρχείων, ένα πρόγραμμα χρησιμοποίησε την κλήση συστήματος ανάγνωσης. Ένας περιγραφέας εγγράφου στον οποίο συνήθως υπάρχει πρόσβαση από προηγούμενη κλήση για άνοιγμα ορίζεται από το αρχείο. Αυτή η ανάγνωση κλήσης συστήματος διαβάζει τις πληροφορίες σε byte και τον ακέραιο αριθμό των οποίων ο καλών καθορίζει από το έγγραφο και στη συνέχεια τις αποθηκεύει σε ένα buffer που παρέχεται από τον μηχανισμό κλήσης.

Ορισμός συνάρτησης

Πριν ορίσετε τη λειτουργία ανάγνωσης στον κώδικά σας, πρέπει να συμπεριλάβετε ορισμένα απαιτούμενα πακέτα.







#περιλαμβάνω

Δείτε πώς ορίζετε τη λειτουργία ανάγνωσης POSIX:



>>ssize_t pread(intελεφαντόδοντο,κενός *μπουφ,μέγεθος_τnbyte, off_t offset)?
>>ssize_t διαβάστε(intfd,κενός *μπουφ,μέγεθος_τnbytes)?

Τρία ορίσματα παραμέτρων μπορούν να ληφθούν από την κλήση της μεθόδου ανάγνωσης:



int fd: Ο περιγραφέας αρχείων του αρχείου από όπου πρέπει να διαβαστούν οι πληροφορίες. Θα μπορούσαμε είτε να χρησιμοποιούμε έναν περιγραφέα αρχείων που αποκτήθηκε μέσω μιας κλήσης ανοικτού συστήματος, είτε θα μπορούσαμε απλά να χρησιμοποιήσουμε 0, 1 ή 2 που αναφέρονται σε τυπική είσοδο, κανονική έξοδο ή κανονικό σφάλμα, αντίστοιχα.





Κενό *buf: Το buffer ή ο πίνακας χαρακτήρων στον οποίο πρέπει να αποθηκευτούν και να διατηρηθούν τα δεδομένα ανάγνωσης.

Size_t nbyte: Ο αριθμός των byte που έπρεπε να διαβαστούν από το έγγραφο πριν από την περικοπή. Όλες οι πληροφορίες μπορούν να αποθηκευτούν στο buffer εάν οι πληροφορίες που πρέπει να διαβαστούν είναι μικρότερες από nbytes.



Περιγραφή

Η μέθοδος read () προσπαθεί να διαβάσει byte «nbyte» στην προσωρινή μνήμη buffer που αναφέρεται με «buf» είτε από το αρχείο που συνδέεται με τον περιγραφέα ανοιχτού εγγράφου ‘Fildes’ είτε από ‘fd’. Δεν καθορίζει τη φύση πολλών ταυτόχρονων διαβάσεων στην ίδια ροή, FIFO ή τερματική μονάδα.

Σε έγγραφα που επιτρέπουν την ανάγνωση, η διαδικασία ανάγνωσης ξεκινά με την αντιστάθμιση του εγγράφου και η μετατόπιση αυξάνεται κατά τον αριθμό των byte που διαβάζονται. Εάν η μετατόπιση εγγράφου βρίσκεται στο ή πέρα ​​από την άκρη του αρχείου, δεν υπάρχουν byte για ανάγνωση και η ανάγνωση () δεν αποδίδει κανένα.

Όταν η καταμέτρηση είναι 0, η ανάγνωση () αναγνωρίζει τα σφάλματα που αναφέρονται παρακάτω. Εάν δεν υπάρχουν λάθη, ή εάν η ανάγνωση () δεν έχει υπολογιστεί με Σφάλματα, η ανάγνωση () αποδίδει μηδέν με μέτρηση 0 και συνεπώς δεν έχει άλλες επιπτώσεις.

Εάν ο αριθμός είναι υψηλότερος από SSIZE_MAX, σύμφωνα με το POSIX.1, τότε το αποτέλεσμα καθορίζεται από την εφαρμογή.

Επιστροφή τιμής

Ο αριθμός των byte που «διαβάζονται» και «pread» επιστρέφονται κατά την επίτευξη πρέπει να είναι ένας μη αρνητικός ακέραιος αριθμός, ενώ μηδενικά σημεία στο τέλος του αρχείου. Η θέση του εγγράφου προωθείται με αυτόν τον αριθμό, αλλιώς, για να δηλώσει ένα σφάλμα, οι μέθοδοι επιστρέφουν -1 και εκχωρούν «errno». Όταν αυτός ο αριθμός είναι μικρότερος από τον αριθμό των byte που ζητούνται, δεν είναι λάθος byte. Πιθανόν να είναι διαθέσιμα λιγότερα byte προς το παρόν.

Σφάλματα

Η λειτουργία pread και read θα είναι ανεπιτυχής εάν προκύψουν αυτά τα σφάλματα:

ΑΛΛΗ:

Το έγγραφο ή ο περιγραφέας αρχείου «fd» ανήκει σε ένα αρχείο χωρίς υποδοχή που έχει επισημανθεί ως μη αποκλεισμός (O NONBLOCK) και θα αποκλείσει την ανάγνωση.

EWOULDBLOCK:

Ο περιγραφέας 'fd' ανήκει σε μια υποδοχή που έχει επισημανθεί ως μη αποκλεισμός (O_NONBLOCK) και θα αποκλείσει την ανάγνωση.

EBADF:

Το ‘fd’ μπορεί να μην είναι περιγραφικός για χρήση ή να μην είναι ανοιχτό για ανάγνωση.

ΠΡΟΤΑΣΗ:

Αυτό συμβαίνει όταν το «buf» σας βρίσκεται εκτός του προσβάσιμου χώρου διευθύνσεων.

EINTR:

Πριν από την ανάγνωση των δεδομένων πληροφοριών, η κλήση μπορεί να διαλύθηκε από ένα σήμα.

ΕΠΙΛΟΓΗ:

Αυτό το σφάλμα παρουσιάζεται όταν ο περιγραφέας «fd» σας εμπλέκεται σε ένα αντικείμενο, το οποίο δεν είναι κατάλληλο για ανάγνωση, ή το έγγραφο έχει λυθεί με τη σημαία O_DIRECT, και η μία ή η άλλη διεύθυνση που αναφέρεται στο «buf», η τιμή που αναφέρεται στο «count» », ή η μετατόπιση εγγράφου δεν σχετίζεται κατάλληλα.

ΕΠΙΛΟΓΗ:

Ο περιγραφέας «fd» μπορεί να έχει σχηματιστεί χρησιμοποιώντας μια κλήση στο timerfd_create (2), και το λάθος buffer μεγέθους έχει δοθεί για ανάγνωση.

EIO:

Είναι σφάλμα εισόδου/εξόδου. Εμφανίζεται όταν η ομάδα διεργασιών παρασκηνίου επιχειρεί να διαβάσει από το ρυθμιστικό τερματικό της και το ένα ή το άλλο παραβλέπει ή αποκλείει το SIGTTIN ή η ομάδα διεργασίας του χάνεται. Ένας άλλος λόγος για αυτό το σφάλμα θα μπορούσε να είναι χαμηλού επιπέδου σφάλμα εισόδου/εξόδου, ενώ διαβάζετε από σκληρό δίσκο ή κασέτα. Μια άλλη πιθανή αιτία EIO στα δίκτυα δεδομένων δεδομένων είναι η κατάργηση του συμβουλευτικού κλειδώματος στον περιγραφέα αρχείων και η αποτυχία αυτού του κλειδώματος.

EISDIR:

Ο περιγραφέας αρχείων ‘fd’ ανήκει σε έναν κατάλογο.

Σημειώσεις:

Πολλά άλλα σφάλματα μπορεί επίσης να προκύψουν, ανάλογα με το αντικείμενο που συνδέεται με τον περιγραφικό «fd». Τόσο οι φόρμες size_t όσο και ssize_t είναι μη επισημασμένοι και επισημασμένοι τύποι αριθμητικών δεδομένων που ορίζονται από το POSIX.1. Στο Linux, το πολύ 0x7ffff000 (2.147.479.552) byte μπορούν να μεταδοθούν με λειτουργία ανάγνωσης (και ισοδύναμες κλήσεις συστήματος), επιστρέφοντας τον αριθμό των byte που μεταδόθηκαν αρχικά (τόσο σε πλατφόρμες 32-bit όσο και 64-bit). Με τα συστήματα αρχείων NFS, μόνο την πρώτη στιγμή που αλλάζει η χρονική σήμανση διαβάζοντας μικροσκοπικές ροές πληροφοριών, οι επόμενες κλήσεις δεν θα το έκαναν. Ενεργοποιείται με την προσωρινή αποθήκευση των χαρακτηριστικών της πλευράς του πελάτη αφού, αν και όχι όλα, οι πελάτες NFS σταματούν την ενημέρωση στον διακομιστή μέσω st_atime (χρόνος τελευταίας πρόσβασης αρχείου) και οι αναγνώσεις από την πλευρά του πελάτη που πραγματοποιούνται από το buffer του προγράμματος-πελάτη δεν θα προκαλέσουν αλλαγές στο st- ταυτόχρονα στον διακομιστή καθώς δεν υπάρχουν διαθέσιμες ενδείξεις από τον διακομιστή. Με την κατάργηση της προσωρινής αποθήκευσης χαρακτηριστικών από την πλευρά του πελάτη, μπορεί να υπάρχει πρόσβαση στα μεταδεδομένα UNIX, αλλά αυτό θα αυξήσει σημαντικά το φορτίο στον διακομιστή και θα επηρεάσει την παραγωγικότητα στις περισσότερες περιπτώσεις.

Παράδειγμα 01:

Ακολουθεί ένα πρόγραμμα C για την επίδειξη της κλήσης λειτουργίας ανάγνωσης στο σύστημα Linux. Γράψτε την παρακάτω εντολή όπως είναι σε νέο αρχείο. Προσθέστε βιβλιοθήκες και στην κύρια συνάρτηση, προετοιμάστε έναν περιγραφέα και μέγεθος. Ο περιγραφέας ανοίγει το αρχείο και το μέγεθος χρησιμοποιείται για την ανάγνωση δεδομένων αρχείου.

Η έξοδος για τον παραπάνω κώδικα θα είναι όπως φαίνεται στην παρακάτω εικόνα.

Παράδειγμα 02:

Ένα άλλο παράδειγμα για την απεικόνιση της λειτουργίας της λειτουργίας ανάγνωσης δίνεται παρακάτω.

Δημιουργήστε ένα άλλο αρχείο και σημειώστε τον παρακάτω κώδικα όπως είναι σε αυτό. Ακολουθούν δύο περιγραφείς, fd1 & fd2, που και οι δύο έχουν τη δική τους πρόσβαση σε αρχείο ανοιχτού πίνακα. Έτσι, για το foobar.txt, κάθε περιγραφέας έχει τη θέση του αρχείου του. Το πρώτο byte του foobar.txt μεταφράζεται από το fd2 και το αποτέλεσμα είναι c = f, όχι c = o.

συμπέρασμα

Έχουμε διαβάσει αποτελεσματικά τη λειτουργία ανάγνωσης POSIX στον προγραμματισμό C. Ας ελπίσουμε ότι δεν έχουν απομείνει αμφιβολίες.