Filehandles, αρχεία, κατάλογοι
link#
Δημιουργεί σκληρό σύνδεσμο από το NEWFILE προς το υπάρχον OLDFILE.
Η link προσθέτει μια δεύτερη εγγραφή καταλόγου που αναφέρεται στο ίδιο υποκείμενο αρχείο με το OLDFILE. Μετά από επιτυχημένη κλήση, το αρχείο έχει δύο ονόματα: OLDFILE και NEWFILE. Και τα δύο ονόματα είναι ισότιμα - το ίδιο το αρχείο δεν διαγράφεται μέχρι να αφαιρεθεί κάθε όνομα και καμία διεργασία να μην κρατά το αρχείο ανοιχτό. Η κλήση είναι λεπτό περιτύλιγμα γύρω από την κλήση συστήματος [link(2)] και κληρονομεί τους περιορισμούς της: και οι δύο διαδρομές πρέπει να επιλύονται στο ίδιο σύστημα αρχείων, και σε συστήματα POSIX μόνο ο superuser μπορεί να κάνει hard-link σε κατάλογο (οι περισσότεροι πυρήνες Linux αρνούνται ακόμα και για τον root).
Σύνοψη#
link OLDFILE, NEWFILE
Τι επιστρέφεται#
1 σε περίπτωση επιτυχίας, 0 σε αποτυχία. Σε αποτυχία, το $! τίθεται στο σφάλμα του συστήματος - τυπικές τιμές είναι EXDEV (σύνδεσμος μεταξύ συσκευών), EPERM (ο στόχος είναι κατάλογος, ή το σύστημα αρχείων απαγορεύει σκληρούς συνδέσμους), EEXIST (το NEWFILE υπάρχει ήδη), EACCES (ανεπαρκή δικαιώματα), και ENOENT (λείπει το OLDFILE).
link $src, $dst
or die "link $src -> $dst failed: $!";
Καθολική κατάσταση που επηρεάζει#
$!- τίθεται σε αποτυχία στον κωδικό σφάλματος του συστήματος.
Παραδείγματα#
Δημιουργία δεύτερου ονόματος για υπάρχον αρχείο:
link "report.txt", "report.bak"
or die "link failed: $!";
Χρησιμοποιήστε stat για να παρατηρήσετε την αύξηση του link count. Το τρίτο στοιχείο της λίστας stat είναι ο αριθμός των σκληρών συνδέσμων που δείχνουν στο inode:
link "data", "data.alt" or die $!;
my $nlink = (stat "data")[3];
print "data has $nlink names\n"; # "data has 2 names"
Ατομική αντικατάσταση αρχείου χτίζοντας τη νέα έκδοση με προσωρινό όνομα, και μετά εναλλαγή με link + rename:
open my $fh, ">", "config.new" or die $!;
print $fh $new_contents;
close $fh;
rename "config.new", "config" or die "rename: $!";
(Για τη γνήσια ατομική-σε-crash παραλλαγή θέλετε link + unlink + rename· δείτε τα σχόλια στο perlport.)
Ανίχνευση αποτυχίας μεταξύ συσκευών και πτώση σε αντιγραφή:
use Errno qw(EXDEV);
unless (link $src, $dst) {
if ($! == EXDEV) {
# /tmp and $HOME are typically different filesystems
copy_file($src, $dst);
} else {
die "link $src -> $dst: $!";
}
}
Οριακές περιπτώσεις#
Κατάλογοι: η
linkσε κατάλογο αποτυγχάνει μεEPERMουσιαστικά σε κάθε σύγχρονο σύστημα. Το POSIX το απαγορεύει για μη-root, και το Linux το απαγορεύει ακόμα και για τον root. Χρησιμοποιήστεsymlinkόταν θέλετε δεύτερο όνομα για κατάλογο.Μεταξύ συστημάτων αρχείων: ο πυρήνας επιστρέφει
EXDEVαν ταOLDFILEκαιNEWFILEεπιλύονται σε διαφορετικά συστήματα αρχείων. Οι σκληροί σύνδεσμοι δεν μπορούν να εκτείνονται μεταξύ σημείων προσάρτησης επειδή μοιράζονται αριθμό inode, ο οποίος έχει σημασία μόνο εντός ενός συστήματος αρχείων.Υπάρχων στόχος: αν το
NEWFILEυπάρχει ήδη, η κλήση αποτυγχάνει μεEEXIST. Ηlinkδεν επικαλύπτει ποτέ. Αφαιρέστε πρώτα τον στόχο μεunlinkαν προτίθεστε αντικατάσταση.Symbolic link ως
OLDFILE: ο σύνδεσμος γίνεται προς τον στόχο του symlink, όχι προς το ίδιο το symlink, στα περισσότερα συστήματα. Αν χρειάζεται να συνδέσετε το symlink, αποαναφέρετέ το ρητά ή χρησιμοποιήστε μια πλατφόρμα που εκθέτειlinkatμεAT_SYMLINK_FOLLOWσβησμένο (δεν είναι διαθέσιμη μέσω του core της Perl).Οι σχετικές διαδρομές επιλύονται έναντι του τρέχοντος καταλόγου εργασίας τη στιγμή της κλήσης, και για τους δύο τελεστέους.
Δικαιώματα: η
linkδεν απαιτεί δικαίωμα εγγραφής στοOLDFILE- μόνο δικαίωμα αναζήτησης στον κατάλογό του και δικαίωμα εγγραφής στον κατάλογο που περιέχει τοNEWFILE.Ίδια διαδρομή και στις δύο πλευρές: η
link $f, $fαποτυγχάνει μεEEXIST.Unlinking: η αφαίρεση του
OLDFILEμεunlinkμετά από επιτυχημένηlinkαφήνει το αρχείο πλήρως προσβάσιμο μέσω τουNEWFILE. Τα δεδομένα απελευθερώνονται μόνο όταν αφαιρεθεί με unlink το τελευταίο όνομα και κανένας ανοιχτός περιγραφέας αρχείου δεν αναφέρεται σε αυτό.Φορητότητα: δεν υποστηρίζει κάθε σύστημα αρχείων σκληρούς συνδέσμους. Τα FAT, exFAT, και πολλά δικτυακά συστήματα αρχείων είτε αρνούνται είτε συμπεριφέρονται σιωπηρά ως αντιγραφές. Δείτε το
perlportγια τη μήτρα πλατφορμών.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
symlink- δημιουργία symbolic link αντί για σκληρό σύνδεσμο· λειτουργεί μεταξύ συστημάτων αρχείων και σε καταλόγουςunlink- αφαιρεί εγγραφή καταλόγου· το ίδιο το αρχείο επιβιώνει για όσο παραμένει άλλος σύνδεσμος ή ανοιχτός περιγραφέαςrename- μετακίνηση ή μετονομασία αρχείου μέσα σε ένα σύστημα αρχείων· ατομική εκεί όπου τοlink+unlinkδεν είναιstat- εξετάστε το link count (πεδίο 3) για να δείτε πόσα ονόματα αναφέρονται στο ίδιο inode$!- το σφάλμα του συστήματος που τίθεται όταν ηlinkεπιστρέφει0