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

endservent#

Κλείνει τη βάση δεδομένων υπηρεσιών μετά από διάσχιση με την getservent.

Η endservent είναι το ήμισυ αποδόμησης της τριάδας επανάληψης της βάσης δεδομένων υπηρεσιών. Αφού η setservent ανοίξει τη βάση (τυπικά /etc/services σε Linux) και μια ακολουθία κλήσεων getservent τη διασχίσει εγγραφή προς εγγραφή, η endservent απελευθερώνει το υποκείμενο handle και οποιαδήποτε ενταμιευμένη κατάσταση κρατάει η βιβλιοθήκη C. Τυλίγει την POSIX κλήση endservent(3) ένα-προς-ένα.

Σύνοψη#

endservent;
endservent();

Τι επιστρέφεται#

Τίποτα χρήσιμο. Η συνάρτηση καλείται για την παρενέργειά της· δεν επιστρέφει ουσιαστική τιμή. Μην ελέγχετε την τιμή επιστροφής.

Καθολική κατάσταση που επηρεάζει#

  • Τον επαναλήπτη της βάσης δεδομένων υπηρεσιών σε επίπεδο συστήματος που ανοίγει η setservent ή έμμεσα η πρώτη κλήση getservent / getservbyname / getservbyport. Η endservent κλείνει αυτόν τον επαναλήπτη.

  • Η $! δεν τίθεται ουσιαστικά από αυτήν την κλήση· το συμβόλαιο POSIX για την endservent(3) δεν ορίζει επιστροφή σφάλματος.

Παραδείγματα#

Σε συνδυασμό με τις setservent και getservent για απαρίθμηση κάθε εγγραφής στο /etc/services:

setservent 0;
while (my @e = getservent) {
    last unless @e;
    my ($name, $aliases, $port, $proto) = @e;
    print "$name/$proto = $port\n";
}
endservent;

Κλείστε μια διάσχιση πρόωρα. Η βάση δεδομένων άνοιξε έμμεσα από την πρώτη getservent· η endservent είναι παρ” όλα αυτά ο σωστός τρόπος να την απελευθερώσετε:

while (my @e = getservent) {
    last if $e[0] eq 'http';
}
endservent;

Αμυντικός καθαρισμός γύρω από ένα μπλοκ που μπορεί να αφήσει τον επαναλήπτη ανοιχτό. Ακίνδυνος όταν δεν βρίσκεται σε εξέλιξη καμία επανάληψη:

eval {
    setservent 1;
    scan_services();
    1;
} or do {
    endservent;          # always release the handle
    die $@;
};
endservent;

Οριακές περιπτώσεις#

  • Η κλήση χωρίς προηγούμενη setservent ή getservent είναι ακίνδυνη. Η υποκείμενη κλήση C ανέχεται ένα no-op κλείσιμο.

  • Διπλή κλήση είναι ακίνδυνη για τον ίδιο λόγο. Επανειλημμένη endservent δεν αναφέρει σφάλμα.

  • Δεν επηρεάζει τις συναρτήσεις αναζήτησης ονόματος και θύρας - οι getservbyname και getservbyport ανοίγουν και κλείνουν τα δικά τους βραχύβια handles και δεν επηρεάζονται από την κατάσταση επαναλήπτη που διαχειρίζεται η endservent.

  • Κανένα πρωτότυπο, κανένα όρισμα. Το endservent $x είναι σφάλμα κατά τη μεταγλώττιση. Χρησιμοποιήστε endservent; ή endservent();.

  • Μη φορητό πέρα από Unix-like συστήματα. Σε πλατφόρμες όπου η βιβλιοθήκη C δεν διαθέτει την endservent(3), η κλήση εκπέμπει endservent not implemented.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • setservent - ανοίξτε τη βάση δεδομένων υπηρεσιών και, με μη μηδενικό STAYOPEN, κρατήστε το handle σε όλες τις επόμενες αναζητήσεις

  • getservent - διαβάστε την επόμενη εγγραφή από την ανοιχτή βάση δεδομένων υπηρεσιών· συνδυάστε κάθε βρόχο επανάληψης με endservent

  • getservbyname - αναζήτηση μίας εκτέλεσης με όνομα υπηρεσίας· δεν αλληλεπιδρά με τον επαναλήπτη που κλείνει η endservent

  • getservbyport - αναζήτηση μίας εκτέλεσης με αριθμό θύρας· ίδια ανεξαρτησία από τον επαναλήπτη

  • endprotoent - το ανάλογο για τη βάση δεδομένων πρωτοκόλλων, ίδια μορφή και ίδιοι κανόνες

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