endnetent#
Κλείνει τη βάση δικτύων μετά την επανάληψη.
Η endnetent απελευθερώνει τους πόρους που κατέχει η βάση δικτύων - συνήθως το αρχείο /etc/networks ή το αντίστοιχο NSS-υποστηριζόμενο - που ανοίχτηκαν σιωπηρά από την πρώτη κλήση στις getnetent, getnetbyname ή getnetbyaddr, ή ρητά από την setnetent. Μετά την endnetent ο δρομέας επανάληψης χάνεται· μια επόμενη getnetent ξεκινά μια νέα σάρωση από την κορυφή της βάσης. Είναι ένα λεπτό περιτύλιγμα της endnetent(3) της βιβλιοθήκης C του συστήματος.
Σύνοψη#
endnetent;
endnetent();
Τι επιστρέφεται#
Μια αληθής τιμή ορισμένη από το σύστημα. Η συνάρτηση C επιστρέφει void· η Perl εκθέτει έναν εκπρόσωπο ώστε η κλήση να μπορεί να σταθεί ως εντολή. Μη συγκρίνετε την επιστρεφόμενη τιμή με τίποτα - δεν υπάρχει τίποτε χρήσιμο μέσα της.
Καθολική κατάσταση που αγγίζει#
Η endnetent ενεργεί επί του δρομέα της βάσης δικτύων που είναι καθολικός σε επίπεδο διεργασίας και ανήκει στη libc. Ο δρομέας αυτός μοιράζεται με τις getnetent, getnetbyname, getnetbyaddr και setnetent· μια κλήση εδώ ακυρώνει την κατάσταση επανάληψης από την οποία εξαρτώνται οι συναρτήσεις αυτές. Καμία ειδική μεταβλητή της Perl δεν αγγίζεται.
Παραδείγματα#
Σε συνδυασμό με τις setnetent και getnetent για μια πλήρη σάρωση της βάσης δικτύων:
setnetent(1); # stayopen = 1
while (my @net = getnetent()) {
my ($name, $aliases, $addrtype, $net) = @net;
print "$name\t$net\n";
}
endnetent(); # release the cursor
Κλείστε μετά τις λίγες αναζητήσεις που πραγματικά χρειαστήκατε, ώστε το αρχείο της βάσης να μη μείνει ανοιχτό για το υπόλοιπο του προγράμματος:
setnetent(0);
my @loopback = getnetbyname("loopback");
my @link = getnetbyname("link-local");
endnetent();
Ασφαλής κλήση όταν η βάση δεν ανοίχτηκε ποτέ - η libc τη μεταχειρίζεται ως no-op:
endnetent(); # harmless on a fresh process
Οριακές περιπτώσεις#
Χωρίς ορίσματα, προτεραιότητα τελεστή λίστας. Η
endnetentδεν παίρνει ορίσματα αλλά αναλύεται ως τελεστής λίστας, οπότε ένας αδέσποτος όρος μετά από αυτήν καταπίνεται: τοendnetent $xείναιendnetent($x)και παράγει σφάλμα μεταγλώττισης «Too many arguments». Γράψτεendnetent;ήendnetent();.Επανειλημμένες κλήσεις. Η κλήση της
endnetentδύο φορές στη σειρά είναι no-op στη δεύτερη κλήση σε κάθε libc που στοχεύουμε. Μη βασίζεστε στο ότι θα προκαλέσει σφάλμα.Αλληλοδιαπλοκή με άλλους επαναλήπτες ΒΔ. Ο δρομέας δικτύων είναι ανεξάρτητος από τους δρομείς που χρησιμοποιούν οι
getpwent,getgrent,gethostent,getprotoentκαιgetservent. Ηendnetentδεν τους κλείνει - καλέστε την αντίστοιχηend*entγια κάθε επαναλήπτη που ανοίξατε.Διχάλωση μεταξύ
setnetentκαιendnetent. Ο δρομέας ζει στην κατάσταση libc του γονέα· ένα παιδί τον κληρονομεί κατά τη στιγμή τουforkαλλά περαιτέρω κλήσεις τηςgetnetentσε οποιαδήποτε διεργασία θα αποσυγχρονιστούν. Κλείστε και ανοίξτε ξανά στο παιδί.Υποστρώματα NSS. Στη glibc η βάση δικτύων δρομολογείται μέσω NSS, οπότε η σημασία του «close» εξαρτάται από τη ρυθμισμένη υπηρεσία (
files,nis,ldap, …). Η συμπεριφορά που βλέπει ο χρήστης - η επανάληψη ξεκινά εκ νέου στην επόμενηgetnetent- είναι η ίδια· το κόστος τηςendnetentδεν είναι.Ασφάλεια νημάτων. Ο δρομέας δικτύων της libc είναι ένας μοναδικός καθολικός πόρος σε επίπεδο διεργασίας. Το pperl δεν σειριοποιεί την πρόσβαση σε αυτόν· ένα πρόγραμμα που επαναλαμβάνει τη βάση δικτύων από πολλά νήματα πρέπει να κάνει το δικό του κλείδωμα.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
setnetent- ανοίγει τη βάση δικτύων και επιλέγει εάν θα παραμένει ανοιχτή κατά τη διάρκεια μεμονωμένων αναζητήσεωνgetnetent- διαβάζει την επόμενη εγγραφή από τον δρομέα που κλείνει ηendnetentgetnetbyname- μεμονωμένη αναζήτηση με όνομα δικτύου· ανοίγει σιωπηρά τη βάση αλλά δεν την κλείνειgetnetbyaddr- μεμονωμένη αναζήτηση με αριθμητική διεύθυνση, ο ίδιος κανόνας σιωπηρού ανοίγματος, χωρίς σιωπηρό κλείσιμοendhostent- το αντίστοιχο για τη βάση κεντρικών υπολογιστών· ίδιο μοτίβο, ανεξάρτητος δρομέαςendservent- το αντίστοιχο για τη βάση υπηρεσιών, για πληρότητα της οικογένειαςend*ent