Μάθετε την εντολή Linux Open

Σύνοψη

#include << A HREF = "αρχείο: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "αρχείο: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "αρχείο: /usr/include/fcntl.h"> fcntl.h> int ανοικτό (const char * pathname , int flags ); int open (const char * pathname , int σημαίες , mode_t mode ); int creat (const char * pathname , τρόπο λειτουργίας_t );

Περιγραφή

Η εντολή open linux () καλείται να μετατρέψει ένα όνομα διαδρομής σε έναν περιγραφέα αρχείου (ένας μικρός μη αρνητικός ακέραιος για χρήση σε επόμενες εισόδους / εξόδους, όπως για ανάγνωση , εγγραφή κλπ.). Όταν η κλήση είναι επιτυχής, ο περιγραφέας του αρχείου που επιστρέφεται θα είναι ο χαμηλότερος περιγραφέας αρχείου που δεν είναι ανοιχτός για τη διαδικασία. Αυτή η κλήση δημιουργεί ένα νέο ανοιχτό αρχείο, το οποίο δεν μοιράζεται με οποιαδήποτε άλλη διαδικασία. (Αλλά τα κοινά ανοικτά αρχεία μπορεί να προκύψουν μέσω της κλήσης συστήματος διχάλας (2).) Ο νέος περιγραφέας αρχείων έχει οριστεί να παραμένει ανοιχτός σε όλες τις λειτουργίες exec (βλ. Fcntl (2)). Η μετατόπιση αρχείου έχει οριστεί στην αρχή του αρχείου.

Οι σημαίες παραμέτρων είναι μία από τις O_RDONLY , O_WRONLY ή O_RDWR που ζητούν το άνοιγμα του αρχείου μόνο για ανάγνωση, μόνο εγγραφή ή ανάγνωση / εγγραφή, αντίστοιχα, bitwise- ή 'd με μηδέν ή περισσότερα από τα ακόλουθα:

O_CREAT

Εάν το αρχείο δεν υπάρχει, θα δημιουργηθεί. Ο κάτοχος (αναγνωριστικό χρήστη) του αρχείου έχει οριστεί ως το αποτελεσματικό αναγνωριστικό χρήστη της διαδικασίας. Η ιδιότητα ομάδας (αναγνωριστικό ομάδας) έχει οριστεί είτε στο ενεργό αναγνωριστικό ομάδας της διαδικασίας είτε στο αναγνωριστικό ομάδας του γονικού καταλόγου (ανάλογα με τον τύπο του συστήματος αρχείων και τις επιλογές σύνδεσης και τη λειτουργία του γονικού καταλόγου, δείτε, π.χ. επιλογές bsdgroups και sysvgroups του συστήματος αρχείων ext2, όπως περιγράφεται στο mount (8)).

O_EXCL

Όταν χρησιμοποιείται με το O_CREAT , εάν το αρχείο υπάρχει ήδη, πρόκειται για σφάλμα και το άνοιγμα θα αποτύχει. Σε αυτό το πλαίσιο, υπάρχει ένας συμβολικός σύνδεσμος, ανεξάρτητα από το πού τα σημεία του. Το O_EXCL είναι κατεστραμμένο σε συστήματα αρχείων NFS , τα προγράμματα τα οποία βασίζονται σε αυτό για εκτέλεση εργασιών κλειδώματος θα περιέχουν μια κατάσταση κούρσας. Η λύση για την εκτέλεση του κλειδώματος ατομικών αρχείων χρησιμοποιώντας ένα lockfile είναι να δημιουργήσετε ένα μοναδικό αρχείο στο ίδιο fs (π.χ., ενσωματώνοντας hostname και pid), χρησιμοποιήστε το σύνδεσμο (2) για να δημιουργήσετε μια σύνδεση στο lockfile. Αν ο σύνδεσμος () επιστρέφει 0, η κλειδαριά είναι επιτυχής. Διαφορετικά, χρησιμοποιήστε το stat (2) στο μοναδικό αρχείο για να ελέγξετε αν ο αριθμός του συνδέσμου αυξήθηκε σε 2, οπότε και η κλειδαριά είναι επίσης επιτυχής.

O_NOCTTY

Εάν το όνομα της διαδρομής αναφέρεται σε μια τερματική συσκευή --- βλέπε tty (4) --- δεν θα γίνει το τερματικό ελέγχου της διεργασίας ακόμα και αν η διαδικασία δεν έχει μία.

O_TRUNC

Εάν το αρχείο υπάρχει ήδη και είναι ένα συνηθισμένο αρχείο και η ανοιχτή λειτουργία επιτρέπει τη γραφή (δηλαδή είναι O_RDWR ή O_WRONLY), θα περικοπεί στο μήκος 0. Εάν το αρχείο είναι αρχείο FIFO ή τερματικής συσκευής, η σημαία O_TRUNC αγνοείται. Διαφορετικά, η επίδραση του O_TRUNC είναι απροσδιόριστη. (Σε πολλές εκδόσεις Linux θα αγνοηθεί · σε άλλες εκδόσεις, θα επιστρέψει ένα σφάλμα.)

O_APPEND

Το αρχείο ανοίγει σε λειτουργία προσάρτησης. Πριν από κάθε εγγραφή , ο δείκτης αρχείου βρίσκεται στο τέλος του αρχείου, σαν να ήταν με το lseek . Το O_APPEND μπορεί να οδηγήσει σε κατεστραμμένα αρχεία σε συστήματα αρχείων NFS εάν περισσότερες από μία διαδικασίες προσθέτουν ταυτόχρονα δεδομένα σε ένα αρχείο. Αυτό οφείλεται στο γεγονός ότι το NFS δεν υποστηρίζει την προσάρτηση σε ένα αρχείο, οπότε ο πυρήνας του πελάτη πρέπει να το προσομοιώνει, κάτι που δεν μπορεί να γίνει χωρίς μια κούρσα.

O_NONBLOCK ή O_NDELAY

Όταν είναι δυνατόν, το αρχείο ανοίγει σε κατάσταση μη αποκλεισμού. Ούτε η ανοικτή ούτε οι επόμενες λειτουργίες στον περιγραφέα αρχείου που επιστρέφεται θα προκαλέσουν αναμονή της διαδικασίας κλήσης. Για τον χειρισμό των FIFO (ονομασμένοι σωλήνες), βλ. Επίσης fifo (4). Αυτή η λειτουργία δεν χρειάζεται να έχει επίδραση σε αρχεία διαφορετικά από τα FIFOs.

O_SYNC

Το αρχείο ανοίγει για σύγχρονα I / O. Οποιαδήποτε εγγραφή στον περιγραφέα αρχείου που προκύπτει θα μπλοκάρει τη διαδικασία κλήσης έως ότου τα δεδομένα έχουν γραφτεί φυσικά στο υποκείμενο υλικό. Δείτε τους ΠΕΡΙΟΡΙΣΜΟΙ παρακάτω.

O_NOFOLLOW

Εάν το όνομα διαδρομής είναι ένας συμβολικός σύνδεσμος, τότε το ανοιχτό παράθυρο αποτυγχάνει. Πρόκειται για μια επέκταση του FreeBSD, η οποία προστέθηκε στο Linux στην έκδοση 2.1.126. Οι συμβολικοί σύνδεσμοι σε προηγούμενα στοιχεία του ονόματος διαδρομής θα εξακολουθήσουν να ακολουθούνται. Οι κεφαλίδες από το glibc 2.0.100 και αργότερα περιλαμβάνουν τον ορισμό αυτής της σημαίας. οι πυρήνες πριν από την 2.1.126 θα το αγνοήσουν αν χρησιμοποιηθούν .

O_DIRECTORY

Εάν το όνομα διαδρομής δεν είναι κατάλογος, τότε το άνοιγμα αποτυγχάνει. Αυτή η σημαία είναι συγκεκριμένη για το Linux και προστέθηκε στον πυρήνα έκδοση 2.1.126, για να αποφευχθούν προβλήματα άρνησης εξυπηρέτησης αν ο opendir (3) καλείται σε συσκευή FIFO ή ταινίας, αλλά δεν πρέπει να χρησιμοποιηθεί εκτός εφαρμογής του opendir .

O_DIRECT

Προσπαθήστε να ελαχιστοποιήσετε τα αποτελέσματα cache της εισόδου / εξόδου από και προς αυτό το αρχείο. Σε γενικές γραμμές, αυτό θα υποβαθμίσει την απόδοση, αλλά είναι χρήσιμο σε ειδικές περιπτώσεις, όπως όταν οι εφαρμογές κάνουν τη δική τους προσωρινή αποθήκευση. Το αρχείο I / O γίνεται απευθείας από / από τα buffer των χρηστών. Η είσοδος / έξοδος είναι σύγχρονη, δηλαδή κατά την ολοκλήρωση της κλήσης συστήματος ανάγνωσης (2) ή εγγραφής (2), τα δεδομένα είναι εγγυημένα ότι έχουν μεταφερθεί. Τα μεγέθη μεταφοράς και η ευθυγράμμιση του buffer χρήστη και της μετατόπισης αρχείων πρέπει να είναι πολλαπλάσια του μεγέθους του λογικού μπλοκ του συστήματος αρχείων.
Αυτή η σημαία υποστηρίζεται σε πολλά συστήματα τύπου Unix. υποστήριξη προστέθηκε κάτω από το Linux στον πυρήνα έκδοση 2.4.10.
Μια σημασιολογικά παρόμοια διεπαφή για συσκευές μπλοκ περιγράφεται στην πρώτη ύλη (8).

O_ASYNC

Δημιουργήστε ένα σήμα (από προεπιλογή το SIGIO, αλλά αυτό μπορεί να αλλάξει μέσω του fcntl (2)) όταν η είσοδος ή η έξοδος είναι δυνατή σε αυτόν τον περιγραφέα αρχείου. Αυτή η λειτουργία διατίθεται μόνο για τερματικά, ψευδο-τερματικά και υποδοχές. Δείτε το fcntl (2) για περισσότερες λεπτομέρειες.

O_LARGEFILE

Σε συστήματα 32 bit που υποστηρίζουν το σύστημα μεγάλων αρχείων, επιτρέψτε σε αρχεία των οποίων τα μεγέθη δεν μπορούν να αναπαρασταθούν σε 31 bits να ανοίξουν.

Ορισμένες από αυτές τις προαιρετικές σημαίες μπορούν να τροποποιηθούν χρησιμοποιώντας το fcntl μετά το άνοιγμα του αρχείου.

Η λειτουργία παραμέτρων καθορίζει τα δικαιώματα χρήσης σε περίπτωση δημιουργίας νέου αρχείου. Τροποποιείται από το umask της διαδικασίας με τον συνήθη τρόπο: οι άδειες του δημιουργούμενου αρχείου είναι (mode & ~ umask) . Σημειώστε ότι αυτή η λειτουργία ισχύει μόνο για μελλοντικές προσβάσεις του αρχείου που δημιουργήθηκε πρόσφατα. η ανοιχτή κλήση που δημιουργεί ένα αρχείο μόνο για ανάγνωση ενδέχεται να επιστρέψει έναν περιγραφέα αρχείου ανάγνωσης / εγγραφής.

Για τη λειτουργία παρέχονται οι ακόλουθες συμβολικές σταθερές:

S_IRWXU

Ο χρήστης 00700 (ιδιοκτήτης αρχείου) έχει διαβάσει, γράψει και εκτελέσει δικαιώματα

S_IRUSR (S_IREAD)

Ο χρήστης 00400 έχει άδεια ανάγνωσης

S_IWUSR (S_IWRITE)

Ο χρήστης 00200 έχει άδεια εγγραφής

S_IXUSR (S_IEXEC)

00100 ο χρήστης έχει εκτελέσει την άδεια

S_IRWXG

Η ομάδα 00070 έχει διαβάσει, γράψει και εκτελέσει την άδεια

S_IRGRP

00040 έχει άδεια ανάγνωσης

S_IWGRP

Η ομάδα 00020 έχει άδεια εγγραφής

S_IXGRP

Η ομάδα 00010 έχει εκτελέσει την άδεια

S_IRWXO

00007 άλλοι έχουν διαβάσει, γράψουν και εκτελέσουν άδεια

S_IROTH

00004 άλλοι έχουν άδεια ανάγνωσης

S_IWOTH

00002 άλλοι έχουν άδεια εγγραφής

S_IXOTH

00001 άλλοι έχουν άδεια εκτέλεσης

mode πρέπει να καθορίζεται όταν το O_CREAT βρίσκεται στις σημαίες και αγνοείται διαφορετικά.

το creat ισοδυναμεί με το άνοιγμα με σημαίες ίσες με O_CREAT | O_WRONLY | O_TRUNC .

ΕΠΙΣΤΡΟΦΗ ΑΞΙΑΣ

να ανοίξει και να δημιουργήσει την επιστροφή του νέου περιγραφέα αρχείου ή -1 αν παρουσιαστεί σφάλμα (στην περίπτωση αυτή, το errno έχει ρυθμιστεί κατάλληλα). Σημειώστε ότι το ανοιχτό μπορεί να ανοίξει ειδικά αρχεία της συσκευής, αλλά το creat δεν μπορεί να τα δημιουργήσει - χρησιμοποιήστε mknod (2) αντ 'αυτού.

Σε συστήματα αρχείων NFS με ενεργοποιημένη τη χαρτογράφηση UID, ανοικτή μπορεί να επιστρέψει έναν περιγραφέα αρχείου, αλλά π.χ. απαγορεύεται η ανάγνωση (2) αιτήσεων με EACCES . Αυτό οφείλεται στο γεγονός ότι ο πελάτης εκτελεί ανοιχτό ελέγχοντας τα δικαιώματα, αλλά η χαρτογράφηση UID εκτελείται από το διακομιστή κατά τις αιτήσεις ανάγνωσης και εγγραφής.

Αν το αρχείο έχει δημιουργηθεί πρόσφατα, τα atime, ctime, mtime πεδία του έχουν οριστεί στην τρέχουσα ώρα, και έτσι είναι τα πεδία ctime και mtime του γονικού καταλόγου. Διαφορετικά, εάν το αρχείο τροποποιηθεί λόγω της σημαίας O_TRUNC, τα πεδία ctime και mtime είναι ρυθμισμένα στην τρέχουσα ώρα.

Λάθη

EEXIST

το όνομα διαδρομής υπάρχει ήδη και χρησιμοποιούνται O_CREAT και O_EXCL .

EISDIR

το όνομα διαδρομής αναφέρεται σε έναν κατάλογο και η ζητούμενη πρόσβαση αφορά τη γραφή (δηλαδή, O_WRONLY ή O_RDWR έχει οριστεί).

EACCES

Η ζητούμενη πρόσβαση στο αρχείο δεν επιτρέπεται ή ένας από τους καταλόγους στο όνομα διαδρομής δεν επιτρέπει την άδεια αναζήτησης (εκτέλεση) ή το αρχείο δεν υπήρχε ακόμα και η πρόσβαση εγγραφής στον γονικό κατάλογο δεν επιτρέπεται.

ENAMETOOLONG

Το όνομα διαδρομής ήταν πολύ μεγάλο.

ENOENT

Το O_CREAT δεν έχει οριστεί και το όνομα δεν υπάρχει. Ή, μια συνιστώσα καταλόγου στο όνομα διαδρομής δεν υπάρχει ή είναι ένας δεσμευτικός συμβολικός σύνδεσμος.

ENOTDIR

Ένα στοιχείο που χρησιμοποιείται ως κατάλογος στο όνομα διαδρομής δεν είναι, στην πραγματικότητα, ένας κατάλογος, ή O_DIRECTORY καθορίστηκε και το όνομα διαδρομής δεν ήταν κατάλογος.

ENXIO

O_NONBLOCK | O_WRONLY έχει οριστεί, το όνομα του αρχείου είναι ένα FIFO και καμία διαδικασία δεν έχει το αρχείο ανοικτό για ανάγνωση. Ή, το αρχείο είναι ένα ειδικό αρχείο της συσκευής και δεν υπάρχει αντίστοιχη συσκευή.

ENODEV

το όνομα διαδρομής αναφέρεται σε ειδικό αρχείο της συσκευής και δεν υπάρχει αντίστοιχη συσκευή. (Πρόκειται για σφάλμα πυρήνα του Linux - σε αυτήν την περίπτωση το ENXIO πρέπει να επιστραφεί.)

EROFS

το όνομα διαδρομής αναφέρεται σε ένα αρχείο σε ένα σύστημα αρχείων μόνο για ανάγνωση και ζητήθηκε πρόσβαση εγγραφής.

ETXTBSY

Το pathname αναφέρεται σε εκτελέσιμη εικόνα που εκτελείται αυτή τη στιγμή και ζητήθηκε πρόσβαση εγγραφής.

EFAULT

σημεία διαδρομής εκτός του προσβάσιμου χώρου διευθύνσεών σας.

ELOOP

Υπήρξαν υπερβολικοί συμβολικοί σύνδεσμοι για την επίλυση του ονόματος διαδρομής , ή O_NOFOLLOW καθορίστηκε αλλά το όνομα διαδρομής ήταν ένας συμβολικός σύνδεσμος.

ENOSPC

πρέπει να δημιουργηθεί όνομα διαδρομής , αλλά η συσκευή που περιέχει τη διαδρομή δεν έχει χώρο για το νέο αρχείο.

ENOMEM

Η ανεπαρκής μνήμη του πυρήνα ήταν διαθέσιμη.

EMFILE

Η διαδικασία έχει ήδη ανοίξει το μέγιστο αριθμό αρχείων.

ENFILE

Έχει επιτευχθεί το όριο του συνολικού αριθμού αρχείων που ανοίγουν στο σύστημα.

Σύμφωνα με

SVR4, SVID, POSIX, X / OPEN, BSD 4.3 Οι σημαίες O_NOFOLLOW και O_DIRECTORY είναι ειδικές για το Linux . Ίσως χρειαστεί να καθορίσετε τη μακροεντολή _GNU_SOURCE για να λάβετε τους ορισμούς τους.

Περιορισμοί

Υπάρχουν πολλές δυσπιστίες στο πρωτόκολλο που υποκρύπτει το NFS, επηρεάζοντας μεταξύ άλλων O_SYNC και O_NDELAY .

Το POSIX παρέχει τρεις διαφορετικές παραλλαγές συγχρονισμένων εισόδων / εξόδων, που αντιστοιχούν στις σημαίες O_SYNC , O_DSYNC και O_RSYNC . Αυτή τη στιγμή (2.1.130) όλα αυτά είναι συνώνυμα στο Linux.