endhostent#
Κλείνει τη βάση δεδομένων υπολογιστών μετά την επανάληψη.
Η endhostent απελευθερώνει οποιουσδήποτε πόρους κρατά η βάση δεδομένων υπολογιστών μετά από διάσχιση που οδηγείται από την gethostent. Ζευγαρώνει με την sethostent, η οποία ανοίγει ή επαναφέρει τη βάση δεδομένων, και είναι άμεσο περιτύλιγμα της ομώνυμης κλήσης της C library. Η κλήση της όταν δεν είναι σε εξέλιξη επανάληψη είναι αβλαβής.
Σύνοψη#
endhostent;
endhostent();
Η endhostent δεν δέχεται ορίσματα. Οι παρενθέσεις είναι προαιρετικές.
Τι επιστρέφεται#
Καμία χρήσιμη τιμή επιστροφής. Η κλήση γίνεται για την παρενέργειά της - την αποδόμηση όποιας κατάστασης ανά διεργασία διατηρεί η gethostent(3) της πλατφόρμας μεταξύ επαναλήψεων (περιγραφείς αρχείων στην παραδοσιακή επανάληψη /etc/hosts, υποδοχές resolver σε συστήματα με NSS).
Καθολική κατάσταση που επηρεάζει#
Τον δρομέα επανάληψης της βάσης δεδομένων υπολογιστών που μοιράζονται οι
gethostent,sethostent,gethostbyname, καιgethostbyaddr. Μετά τηνendhostent, η επόμενη κλήσηgethostentξεκινά εκ νέου από την αρχή (συνήθως μετά από σιωπηρήsethostent).Το
$?μεταφέρει την τιμήh_errnoτης C library σε συστήματα όπου οι αναζητήσεις υπολογιστών την αναδύουν. Οι περισσότερες υλοποιήσεις τηςendhostentη ίδια δεν αγγίζουν τοh_errno, αλλά μια επόμενηgethostentμπορεί να το κάνει.
This state is per-process, not per-thread. Two threads iterating hosts concurrently will interleave records and neither will see the full set
pair
sethostent/gethostent/endhostentwithin one thread.
Παραδείγματα#
Κλείσιμο της βάσης δεδομένων μετά από πλήρη διάσχιση:
sethostent(1); # 1 = keep connection open
while (my @h = gethostent()) {
print "$h[0]\n"; # canonical hostname
}
endhostent();
Πάντα ζευγαρώνετε endhostent με sethostent μέσα σε υπορουτίνα ώστε η κατάσταση επανάληψης να μη διαρρέει στον καλούντα:
sub list_hosts {
sethostent(0);
my @names;
while (my ($name) = gethostent()) {
push @names, $name;
}
endhostent();
return @names;
}
Αμυντικός καθαρισμός - η endhostent είναι ασφαλής ακόμα κι όταν δεν είναι σε εξέλιξη επανάληψη, οπότε είναι εντάξει να την καλείτε χωρίς όρους σε διαδρομή σφάλματος:
eval {
sethostent(1);
process_hosts();
1;
} or do {
my $err = $@;
endhostent();
die $err;
};
endhostent();
Η χρήση της αντικειμενοστραφούς διεπαφής accessor από το Net::hostent δεν αλλάζει τον κανόνα - ο υποκείμενος επαναλήπτης είναι ο ίδιος που κλείνει η endhostent:
use Net::hostent;
sethostent(1);
while (my $h = gethostent()) {
print $h->name, "\n";
}
endhostent();
Οριακές περιπτώσεις#
No-op όταν δεν είναι τίποτα ανοιχτό: η κλήση της
endhostentχωρίς προηγούμενηsethostentήgethostentείναι ορισμένη και δεν κάνει τίποτα παρατηρήσιμο.Διαπλοκή με αναζητήσεις βάσει ονόματος / διεύθυνσης: μια κλήση
gethostbynameήgethostbyaddrστη μέση επανάληψης μπορεί να επαναφέρει τον δρομέα σε ορισμένες πλατφόρμες (κάθε υλοποίηση που εσωτερικά καλείsethostent(0)για αναζητήσεις μίας εκτέλεσης). Μην αναμιγνύετε τα δύο στυλ έναντι της ίδιας βάσης δεδομένων χωρίς εκ νέου κλήση τηςsethostentμετά.Πλατφόρμες χωρίς επαναλήπτη υπολογιστών: σε συστήματα των οποίων ο resolver δεν υποστηρίζει αρίθμηση (οι περισσότερες σύγχρονες διαμορφώσεις NSS που ερωτούν μόνο DNS), η
gethostentεπιστρέφει αμέσως κενή λίστα. Ηendhostentεξακολουθεί να είναι καλέσιμη και εξακολουθεί να είναι no-op.Ασφάλεια threads: ο επαναλήπτης υπολογιστών είναι καθολικός σε επίπεδο διεργασίας. Σε πρόγραμμα πολλών threads, προστατέψτε την τριάδα
sethostent/gethostent/endhostentμε δικό σας mutex.Πρωτότυπο / ανάλυση: η
endhostentδεν έχει ορίσματα, οπότε δεν υπάρχει παγίδα αμφισημίας του αναλυτή. Η γραφήendhostent LISTείναι συντακτικό σφάλμα αντί να ερμηνεύεται σιωπηλά ως κλήση με ορίσματα.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
sethostent- ανοίγει ή επαναφέρει τη βάση δεδομένων υπολογιστών· το ανοιγόμενο μισό του ζεύγους επανάληψηςgethostent- διαβάζει μία εγγραφή από την ανοιχτή βάση δεδομένων· επιστρέφει την κενή λίστα όταν εξαντληθεί η επανάληψηgethostbyname- αναζήτηση μίας εκτέλεσης βάσει ονόματος· δεν απαιτείsethostent/endhostentgethostbyaddr- αναζήτηση μίας εκτέλεσης βάσει διεύθυνσηςendnetent- ίδιο μοτίβο για τη βάση δεδομένων δικτύωνendservent- ίδιο μοτίβο για τη βάση δεδομένων υπηρεσιών$?- λαμβάνει τοh_errnoαπό αποτυχημένες αναζητήσεις υπολογιστών σε πλατφόρμες όπου η C library το εκθέτει