Skip to main content

Άνοιγμα της εντολής Linux και της εντολής Unix

5ο Μάθημα της σειράς μαθημάτων "Η γραμμή εντολών Linux" - 27/01/2013 (Ενδέχεται 2024)

5ο Μάθημα της σειράς μαθημάτων "Η γραμμή εντολών Linux" - 27/01/2013 (Ενδέχεται 2024)
Anonim

Σύνοψη

#περιλαμβάνω #περιλαμβάνω #περιλαμβάνω int ανοικτό (const char * όνομα διαδρομής , int σημαίες ); int ανοικτό (const char * όνομα διαδρομής , int σημαίες , mode_t τρόπος ); int creat (const char * όνομα διαδρομής , mode_t τρόπος );

Περιγραφή

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

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

O_CREAT

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

O_EXCL

Όταν χρησιμοποιείται μεO_CREAT, αν το αρχείο υπάρχει ήδη, είναι ένα σφάλμα και τοΆνοιξε θα αποτύχει. Σε αυτό το πλαίσιο, υπάρχει ένας συμβολικός σύνδεσμος, ανεξάρτητα από το πού τα σημεία του.O_EXCL είναι σπασμένα σε συστήματα αρχείων NFS, τα προγράμματα που βασίζονται σε αυτό για την εκτέλεση εργασιών κλειδώματος θα περιέχουν μια κατάσταση κούρσας. Η λύση για την εκτέλεση του κλειδώματος ατομικών αρχείων χρησιμοποιώντας ένα lockfile είναι να δημιουργήσετε ένα μοναδικό αρχείο στο ίδιο fs (π.χ., ενσωματώνοντας το hostname και το pid), χρησιμοποιήστε το link (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. Οποιοςγράφωs στον περιγραφέα του αρχείου που θα προκύψει θα εμποδίσει τη διαδικασία κλήσης έως ότου τα δεδομένα έχουν γραφτεί φυσικά στο υποκείμενο υλικό. Δείτε τους ΠΕΡΙΟΡΙΣΜΟΙ παρακάτω.

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 άλλοι έχουν άδεια εκτέλεσης

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

creat είναι ισοδύναμο μεΆνοιξε με σημαίες ίσο μεO_CREAT | O_WRONLY | O_TRUNC.

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

Άνοιξε καιcreat επιστρέφει τον νέο περιγραφέα αρχείου ή -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

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

EFAULT

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

ELOOP

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

ENOSPC

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

ENOMEM

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

EMFILE

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

ENFILE

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

Σύμφωνα με

SVR4, SVID, POSIX, X / OPEN, BSD 4.3O_NOFOLLOW καιO_DIRECTORY οι σημαίες είναι ειδικές για το Linux. Κάποιος μπορεί να πρέπει να καθορίσει το_GNU_SOURCE macro για να αποκτήσουν τους ορισμούς τους.

Περιορισμοί

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

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