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

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 / endhostent within 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 / endhostent

  • gethostbyaddr - αναζήτηση μίας εκτέλεσης βάσει διεύθυνσης

  • endnetent - ίδιο μοτίβο για τη βάση δεδομένων δικτύων

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

  • $? - λαμβάνει το h_errno από αποτυχημένες αναζητήσεις υπολογιστών σε πλατφόρμες όπου η C library το εκθέτει