Filehandles, αρχεία, κατάλογοι
sysopen#
Ανοίγει ένα αρχείο με χαμηλού επιπέδου τρόπο, περνώντας μια ακέραιη μάσκα bits MODE απευθείας στην υποκείμενη κλήση συστήματος open(2).
Η sysopen είναι η διέξοδος για όταν το DWIM της λειτουργίας συμβολοσειράς της open σας εμποδίζει - όταν χρειάζεστε O_EXCL για ατομικό create-if-not-exist, O_NOFOLLOW για άρνηση συμβολικών λινκ, O_NONBLOCK σε FIFO, ή οποιαδήποτε άλλη σημαία που δεν έχει αντίστοιχη συμβολοσειρά "<" / ">" / ">>". Οι σταθερές σημαιών βρίσκονται στο Fcntl και συνδυάζονται με |.
Σύνοψη#
sysopen FILEHANDLE, FILENAME, MODE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
Τι επιστρέφεται#
1 σε επιτυχία, undef σε αποτυχία (με το $! ορισμένο στο errno από την αποτυχημένη κλήση συστήματος). Σε αντίθεση με την open, δεν υπάρχει μαγεία - το FILENAME λαμβάνεται κυριολεκτικά, δεν ερμηνεύεται κανένα προπορευόμενο >, <, |, ή -, δεν αναλύεται καμία συμβολοσειρά λειτουργίας με στρώματα.
Αν το FILEHANDLE είναι μη ορισμένο βαθμωτό, αυτο-δημιουργείται σε νέο handle:
sysopen my $fh, $path, O_RDONLY
or die "sysopen $path: $!";
MODE - η μάσκα bits του Fcntl#
Το MODE είναι ακέραιος κατασκευασμένος με OR σταθερών από το Fcntl. Η λειτουργία πρόσβασης είναι υποχρεωτική και αμοιβαία αποκλειόμενη· οι σημαίες τροποποιητών είναι προαιρετικές και συνδυάζονται ελεύθερα:
Σημαία | Σημασία |
|---|---|
| Άνοιγμα μόνο για ανάγνωση. |
| Άνοιγμα μόνο για εγγραφή. |
| Άνοιγμα για ανάγνωση και εγγραφή. |
| Δημιουργία του αρχείου αν δεν υπάρχει. |
| Μαζί με |
| Κάθε εγγραφή αναζητά πρώτα το τέλος του αρχείου (ατομική προσάρτηση). |
| Αποκοπή του αρχείου σε μηδενικό μήκος κατά το άνοιγμα. |
| Μη μπλοκάρουσα λειτουργία για τον προκύπτοντα περιγραφέα. |
| Αποτυχία με |
Εισάγετέ τες με το όνομά τους ή με ετικέτα:
use Fcntl qw(O_RDWR O_CREAT O_EXCL O_APPEND);
# or
use Fcntl ':DEFAULT';
Οι παλιές τιμές 0, 1, 2 για read-only, write-only, read-write επίσης λειτουργούν σε κάθε σύστημα που υποστηρίζει η Perl, αλλά ονοματίστε τις σταθερές - ο προκύπτων κώδικας επιβιώνει αναθεώρηση μεταξύ πλατφορμών και διαβάζεται χωρίς γλωσσάρι.
PERMS - τα bits δικαιωμάτων κατά τη δημιουργία#
Το PERMS είναι οκταδικό mode (όπως δέχεται η chmod) που εφαρμόζεται στο inode μόνο όταν το O_CREAT δημιουργεί πραγματικά το αρχείο. Αν παραλειφθεί το PERMS, η Perl περνά 0666. Η umask της διεργασίας εφαρμόζεται από τον πυρήνα από πάνω, οπότε μια προεπιλεγμένη umask 022 αποδίδει 0644 στον δίσκο.
sysopen my $fh, $path, O_WRONLY | O_CREAT | O_EXCL, 0600
or die "create $path: $!";
Μη γράφετε 0644 ως όρισμα PERMS χωρίς λόγο. Ένα σκληρά κωδικοποιημένο 0644 αφαιρεί την εγγραφή ομάδας ακόμη και από χρήστες που σκόπιμα ορίζουν ανεκτικό umask· το 0666 μαζί με το umask του χρήστη είναι η φορητή προεπιλογή και αυτό χρησιμοποιεί η sysopen όταν παραλείπετε το όρισμα εντελώς.
Καθολική κατάσταση που επηρεάζει#
$!- ορίζεται σε αποτυχία στοerrnoπου επιστρέφει ηopen(2).${^OPEN}- η διαμόρφωση στρωμάτων της pragmaopen. Ηsysopenεφαρμόζει την ίδια προεπιλεγμένη στοίβα PerlIO που θα εφαρμόσει ηopenγια κλήση χωρίς στρώματα. Χρησιμοποιήστεbinmodeαμέσως μετά από επιτυχήsysopenόταν χρειάζεται να υπερκαλύψετε ή να αφαιρέσετε στρώματα (τυπικό για δυαδικά αρχεία, υποδοχές ως αρχεία, ή περιγραφείςO_NONBLOCK).umaskδιεργασίας - μασκάρει τοPERMSόταν τοO_CREATδημιουργεί το αρχείο.
Παραδείγματα#
Ατομικό create-if-not-exist - ο κανονικός λόγος καταφυγής στη sysopen:
use Fcntl qw(O_WRONLY O_CREAT O_EXCL);
sysopen my $fh, "lock.pid", O_WRONLY | O_CREAT | O_EXCL, 0644
or die "another instance is already running: $!";
print $fh "$$\n";
close $fh;
Άνοιγμα-ή-δημιουργία για ανάγνωση/εγγραφή, διατηρώντας το υπάρχον περιεχόμενο:
use Fcntl qw(O_RDWR O_CREAT);
sysopen my $fh, $path, O_RDWR | O_CREAT, 0666
or die "sysopen $path: $!";
Καταγραφή μόνο με προσάρτηση με την εγγύηση append - κάθε εγγραφή προσγειώνεται στο EOF ανεξάρτητα από την εναλλαγή με άλλους εγγραφείς:
use Fcntl qw(O_WRONLY O_CREAT O_APPEND);
sysopen my $log, "/var/log/app.log", O_WRONLY | O_CREAT | O_APPEND, 0644
or die "open log: $!";
print $log "startup\n";
Άνοιγμα FIFO χωρίς μπλοκάρισμα στη χειραψία της πλευράς αναγνώστη:
use Fcntl qw(O_RDONLY O_NONBLOCK);
sysopen my $fifo, "/tmp/q", O_RDONLY | O_NONBLOCK
or die "sysopen fifo: $!";
Άρνηση ακολούθησης symlink στο φύλλο - χρήσιμο σε καταλόγους εγγράψιμους από μη έμπιστους χρήστες:
use Fcntl qw(O_RDONLY O_NOFOLLOW);
sysopen my $fh, "$dir/config", O_RDONLY | O_NOFOLLOW
or die "sysopen config: $!";
Επιβολή I/O σε επίπεδο byte μετά το άνοιγμα - αφαίρεση οποιουδήποτε στρώματος :utf8 ή :crlf που η προεπιλεγμένη στοίβα PerlIO θα εγκαθιστούσε διαφορετικά:
sysopen my $fh, $path, O_RDONLY or die $!;
binmode $fh;
Οριακές περιπτώσεις#
Το
O_EXCLχωρίςO_CREATείναι no-op. Ο έλεγχος αποκλειστικότητας ενεργοποιείται μόνο όταν τοO_CREATζητά από τον πυρήνα να δημιουργήσει το αρχείο. Γράφετέ τα πάντα μαζί:O_CREAT | O_EXCL.Το
O_EXCLδεν είναι κλείδωμα. Εμποδίζει επιτυχημένο άνοιγμα σε αρχείο που ήδη υπάρχει, τίποτε άλλο. Μόλις το αρχείο υπάρχει, κάθε επόμενηsysopenμεO_CREAT | O_EXCLαποτυγχάνει. Δεν σειριοποιεί την πρόσβαση στο περιεχόμενο - χρησιμοποιήστεflockγι” αυτό.Το
O_EXCLσε δικτυακά συστήματα αρχείων. Οι υλοποιήσεις NFS διαφέρουν· παλαιότερες εκδόσεις NFS χάνουν σιωπηρά τη σημασιολογία αποκλειστικότητας. Μη βασίζεστε στοO_EXCLσε NFSv2.O_CREAT | O_EXCLκαι symlinks. Με τις δύο σημαίες ορισμένες, ο πυρήνας αρνείται να ανοίξει προϋπάρχον symlink στο τελικό συστατικό διαδρομής. Δεν προστατεύει ενδιάμεσα συστατικά διαδρομής· χρησιμοποιήστεO_NOFOLLOWή επιλύστε τον κατάλογο μεopendirκαι σημασιολογίαopenatαν το χρειάζεστε.O_TRUNCμεO_RDONLY. Η συμπεριφορά είναι απροσδιόριστη από το POSIX. Μην τα συνδυάζετε.Παραλειπόμενο
PERMS. Η προεπιλογή είναι0666, μασκαρισμένο από τοumask. Δεν είναι0644. Παραλείπετε τοPERMSεκτός αν ενεργά θέλετε να υπερκαλύψετε τοumaskτου χρήστη.FILEHANDLEως έκφραση. Αν τοFILEHANDLEείναι bareword, ονομάζει μια καθολική μεταβλητή πακέτου. Αν είναι έκφραση που αξιολογείται σε glob, globref, ήIO::Handle, ανοίγει αυτό το handle. Αν είναι μη ορισμένο βαθμωτό, αυτο-δημιουργείται μέσα του ένα νέο handle - η λεξιλογική μορφή που χρησιμοποιείται σε όλα αυτά τα παραδείγματα.Καμία μαγεία στο
FILENAME. ΈναFILENAME"-"ανοίγει αρχείο που ονομάζεται κυριολεκτικά-, όχι τοSTDIN. Ένα προπορευόμενο>ανοίγει αρχείο που ονομάζεται κυριολεκτικά>filename, όχι εγγραφή στοfilename. Αυτό είναι όλο το νόημα τηςsysopenέναντι τηςopen.Τα προεπιλεγμένα στρώματα PerlIO εξακολουθούν να εφαρμόζονται. Η
sysopenείναι «χαμηλού επιπέδου» σε σχέση με τη συμβολοσειρά λειτουργίας, όχι σε σχέση με το PerlIO. Το προκύπτον handle έχει την ίδια στοίβα στρωμάτων με μια χωρίς στρώματαopen· καλέστεbinmodeγια να την αλλάξετε.Κλειστή ή μη έγκυρη έκφραση
FILEHANDLE. Επιστρέφειundefμε ορισμένο το$!(συνήθωςEBADFγια κακό υπάρχοντα περιγραφέα·ENOENT,EACCES,EEXIST,ELOOPγια σφάλματα σε επίπεδο διαδρομής).
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
open- υψηλότερου επιπέδου ανοιχτήρας με ανάλυση συμβολοσειράς λειτουργίας, σωλήνες,-ωςSTDIN/STDOUT, και λειτουργίες με στρώματα· χρησιμοποιήστε το εκτός αν χρειάζεστε ειδικά κάποια σημαία που εκθέτει ηsysopenfcntl- αλλάζει σημαίες σε ήδη ανοιχτό περιγραφέα (π.χ. ορισμόςO_NONBLOCKεκ των υστέρων)· μοιράζεται το λεξιλόγιο σταθερών τουFcntlsysread- ανάγνωση χωρίς ενταμιευτή· λειτουργεί σε οποιοδήποτε handle, όχι μόνο σε αυτό που ελήφθη απόsysopen, παρά το όνομαsyswrite- εγγραφή χωρίς ενταμιευτή, ίδια σημείωσηFcntl- το άρθρωμα που εξάγει τις σταθερέςO_*και τις ετικέτες:DEFAULT/:flock/:modebinmode- ορισμός ή αφαίρεση στρωμάτων PerlIO στο handle μετά το άνοιγμαumask- η μάσκα διεργασίας που αφαιρεί bits από τοPERMSόταν τοO_CREATδημιουργεί το αρχείο