sethostent#
Ανοίγει ή επανατυλίγει τη βάση δεδομένων υπολογιστών για επανάληψη.
Η sethostent προετοιμάζει τη βάση δεδομένων υπολογιστών του συστήματος (τυπικά /etc/hosts συν τυχόν πηγές υπηρεσίας ονομάτων που έχουν ρυθμιστεί από την πλατφόρμα) για σειριακή διάσχιση με την gethostent, και επανατυλίγει τον δρομέα αν η επανάληψη βρίσκεται ήδη σε εξέλιξη. Το STAYOPEN είναι σημαία που περνάει στην υποκείμενη C κλήση sethostent(3): αληθής τιμή ζητάει από τον resolver να κρατήσει τη βάση ανοιχτή σε όλες τις επόμενες αναζητήσεις gethostby*, που σε ορισμένα συστήματα αποφεύγει το ξανα-άνοιγμα του αρχείου ή την επανασύνδεση στην υπηρεσία ονομάτων για κάθε ερώτημα.
Σύνοψη#
sethostent STAYOPEN
sethostent 0
sethostent 1
Τι επιστρέφεται#
Δεν επιστρέφει τίποτα χρήσιμο. Η κλήση γίνεται για την παρενέργειά της να εκκινήσει τον επαναλήπτη· αγνοήστε την τιμή επιστροφής.
Καθολική κατάσταση που επηρεάζει#
Τροποποιεί καθολική σε επίπεδο διεργασίας κατάσταση του resolver που διατηρείται από τη βιβλιοθήκη C: τον περιγραφέα αρχείου της βάσης δεδομένων υπολογιστών ή το handle της υπηρεσίας ονομάτων, και τον δρομέα επανάληψης ανά διεργασία που διαβάζει η gethostent. Δύο κομμάτια κώδικα στην ίδια διεργασία που διασχίζουν ταυτόχρονα τη βάση δεδομένων υπολογιστών θα μπερδευτούν - υπάρχει ένας δρομέας, όχι ένας ανά καλούντα. Σε αποτυχία, η $! τίθεται από την υποκείμενη κλήση συστήματος· δεν υπάρχει αναφορά τύπου h_errno για αυτήν τη συνάρτηση.
Παραδείγματα#
Διασχίστε κάθε εγγραφή στη βάση δεδομένων υπολογιστών:
sethostent(0);
while (my ($name, $aliases, $addrtype, $length, @addrs)
= gethostent()) {
print "$name\n";
}
endhostent();
Ζητήστε από τον resolver να κρατήσει τη βάση ανοιχτή ενώ τρέχει μια παρτίδα αναζητήσεων ονόματος-σε-διεύθυνση, και μετά κλείστε την:
sethostent(1);
for my $host (@hosts) {
my $packed = gethostbyname($host);
# ...
}
endhostent();
Επανατυλίξτε μια εν εξελίξει επανάληψη για να ξεκινήσετε ξανά από την πρώτη εγγραφή:
sethostent(0);
my $first = (gethostent())[0];
sethostent(0); # back to the top
my $first_again = (gethostent())[0];
Οριακές περιπτώσεις#
Το
STAYOPENείναι υποχρεωτικό συντακτικά, όχι σημασιολογικά. Το όρισμα πρέπει να υπάρχει - τοsethostent;είναι σφάλμα μεταγλώττισης - αλλά πολλές πλατφόρμες αγνοούν τη σημαία και πάντα κρατούν τη βάση ανοιχτή για τη διάρκεια της επανάληψης. Περάστε0όταν δεν έχετε προτίμηση.Δεν έχει κάθε πλατφόρμα ουσιαστικό επαναλήπτη υπολογιστών. Σε συστήματα όπου η βάση δεδομένων υπολογιστών εξυπηρετείται αποκλειστικά από DNS ή υπηρεσία ονομάτων που δεν εκθέτει απαρίθμηση, η
gethostentεπιστρέφει την κενή λίστα στην πρώτη κλήση ανεξάρτητα από τηνsethostent. Η ίδια η κλήση και πάλι πετυχαίνει.Ασφάλεια σε threads. Ο δρομέας του resolver είναι ανά διεργασία, όχι ανά thread. Δύο threads που επαναλαμβάνουν ταυτόχρονα θα διαπλέξουν εγγραφές και κανένα δεν θα δει την πλήρη λίστα. Η upstream Perl αντικαθιστά παραλλαγές
*_rγια σημειακές αναζητήσεις όπως ηgethostbynameόπου είναι διαθέσιμες· δεν υπάρχει thread-safe παραλλαγή του επαναλήπτη.Αλληλεπίδραση με τις cache της
gethostby*. Σε ορισμένες υλοποιήσεις libc, έναsethostent(1)πριν από μια ριπή κλήσεωνgethostbyname/gethostbyaddrκρατάει το υποκείμενο αρχείο ανοιχτό μεταξύ ερωτημάτων· σε άλλες δεν έχει κανένα αποτέλεσμα. Μετρήστε πριν βασιστείτε σε αυτό ως βελτιστοποίηση.Συνδυάστε με
endhostent. Αφήνοντας τη βάση ανοιχτή μετά την επανάληψη μπορεί να διαρρεύσει περιγραφέας αρχείου ή σύνδεση resolver. Πάντα κλείνετε τη διάσχιση μεendhostent.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
gethostent- διαβάστε την επόμενη εγγραφή από τη βάση δεδομένων υπολογιστών αφού ηsethostentέχει εκκινήσει τον δρομέαendhostent- κλείστε τη βάση και απελευθερώστε την κατάσταση του resolver όταν τελειώσει η επανάληψηgethostbyname- σημειακή αναζήτηση με όνομα· επωφελείται απόsethostent(1)σε πλατφόρμες που το τιμούνgethostbyaddr- σημειακή αναζήτηση με διεύθυνση· ίδια επιφύλαξη με τηνgethostbynamesetnetent- το αντίστοιχο για τη βάση δεδομένων δικτύων, ίδιο μοτίβο επανάληψηςsetservent- το αντίστοιχο για τη βάση δεδομένων υπηρεσιών