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- διαβάστε την επόμενη εγγραφή από την ανοιχτή βάση δεδομένων υπηρεσιών· συνδυάστε κάθε βρόχο επανάληψης μεendserventgetservbyname- αναζήτηση μίας εκτέλεσης με όνομα υπηρεσίας· δεν αλληλεπιδρά με τον επαναλήπτη που κλείνει ηendserventgetservbyport- αναζήτηση μίας εκτέλεσης με αριθμό θύρας· ίδια ανεξαρτησία από τον επαναλήπτηendprotoent- το ανάλογο για τη βάση δεδομένων πρωτοκόλλων, ίδια μορφή και ίδιοι κανόνεςendhostent- το ανάλογο για τη βάση δεδομένων υπολογιστών