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

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 - σημειακή αναζήτηση με διεύθυνση· ίδια επιφύλαξη με την gethostbyname

  • setnetent - το αντίστοιχο για τη βάση δεδομένων δικτύων, ίδιο μοτίβο επανάληψης

  • setservent - το αντίστοιχο για τη βάση δεδομένων υπηρεσιών