Πληροφορίες δικτύου

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 - διαβάζει την επόμενη εγγραφή από τον δρομέα που κλείνει η endnetent

  • getnetbyname - μεμονωμένη αναζήτηση με όνομα δικτύου· ανοίγει σιωπηρά τη βάση αλλά δεν την κλείνει

  • getnetbyaddr - μεμονωμένη αναζήτηση με αριθμητική διεύθυνση, ο ίδιος κανόνας σιωπηρού ανοίγματος, χωρίς σιωπηρό κλείσιμο

  • endhostent - το αντίστοιχο για τη βάση κεντρικών υπολογιστών· ίδιο μοτίβο, ανεξάρτητος δρομέας

  • endservent - το αντίστοιχο για τη βάση υπηρεσιών, για πληρότητα της οικογένειας end*ent