setservent#
Επανατυλίγει τη βάση δεδομένων υπηρεσιών και προαιρετικά την κρατά ανοιχτή σε όλη τη διάρκεια των αναζητήσεων.
Η setservent είναι το αντίστοιχο για βάση δεδομένων υπηρεσιών του setservent(3) της βιβλιοθήκης C. Επαναφέρει τον εσωτερικό δρομέα που χρησιμοποιεί η getservent ώστε η επόμενη κλήση να ξεκινήσει πάλι από την πρώτη εγγραφή του /etc/services (ή όποιας άλλης πηγής έχει διαμορφωθεί να χρησιμοποιεί ο επιλυτής συστήματος), και ελέγχει αν το υποκείμενο αρχείο παραμένει ανοιχτό μεταξύ αναζητήσεων κατ” όνομα και κατά θύρα.
Σύνοψη#
setservent STAYOPEN
setservent 0 # close file between lookups (default)
setservent 1 # keep file open across lookups
Τι επιστρέφεται#
The return value is whatever the underlying C setservent(3) returns
on most systems that’s nothing useful, and scripts do not check it. Treat
setserventas called for its side effect on the iterator, not for a value.
Καθολική κατάσταση που επηρεάζει#
Ο δρομέας βάσης δεδομένων υπηρεσιών ανά διεργασία, μοιραζόμενος με τις
getservent,getservbyname,getservbyportκαιendservent. Και οι τέσσερις διαβάζουν και τροποποιούν την ίδια κατάσταση· η επανάληψη δεν είναι ασφαλής για νήματα ούτε επανεισαγωγίσιμη.Η κατάσταση ανοιχτό/κλειστό του αρχείου βάσης δεδομένων υπηρεσιών. Με
STAYOPENαληθές το αρχείο παραμένει ανοιχτό μέχρι να κληθεί ηendservent· μεSTAYOPENψευδές (η προεπιλογή) κάθε επόμενη αναζήτηση κατ” όνομα ή κατά θύρα ανοίγει και κλείνει εκ νέου το αρχείο.
Το όρισμα STAYOPEN#
Δώστε αληθή τιμή για να κρατήσετε το αρχείο ανοιχτό σε μια σειρά μεμονωμένων αναζητήσεων getservbyname ή getservbyport. Αυτό είναι βελτιστοποίηση για ομαδική επίλυση, όχι σημασιολογική αλλαγή: τα αποτελέσματα είναι πανομοιότυπα και στις δύο περιπτώσεις.
setservent 1;
for my $name (@service_names) {
my @svc = getservbyname $name, "tcp";
# ... process @svc ...
}
endservent;
Δώστε ψευδή τιμή (ή 0) όταν θέλετε κάθε αναζήτηση να ξανανοίγει το αρχείο. Αυτή είναι η προεπιλεγμένη συμπεριφορά και αυτή που θέλουν τα περισσότερα προγράμματα.
Παραδείγματα#
Διασχίστε κάθε εγγραφή στη βάση δεδομένων υπηρεσιών και εκτυπώστε ζεύγη ονόματος/θύρας:
setservent 0;
while (my ($name, undef, $port, $proto) = getservent) {
print "$name $port/$proto\n";
}
endservent;
Επανατυλίξτε στα μέσα της επανάληψης για να ξεκινήσετε ξανά:
setservent 0;
my @first_pass;
while (my @svc = getservent) {
push @first_pass, $svc[0];
last if @first_pass == 10;
}
setservent 0; # cursor back to start
my @second_pass = getservent; # first entry again
endservent;
Ομαδική επίλυση με το αρχείο κρατημένο ανοιχτό:
my @wanted = qw(http https ssh smtp);
setservent 1;
my %port = map { $_ => scalar getservbyname($_, "tcp") } @wanted;
endservent;
Οριακές περιπτώσεις#
Το
STAYOPENαπαιτείται στο επίπεδο της Perl. Ηsetserventαναλύεται με προτεραιότητα τελεστή λίστας και διαβάζει ένα όρισμα· μια σκέτηsetservent;χωρίς όρισμα είναι σφάλμα μεταγλώττισης. Δώστε0όταν θέλετε την προεπιλεγμένη συμπεριφορά «κλείσιμο μετά από κάθε αναζήτηση».Εξάρτηση από πλατφόρμα. Η βάση δεδομένων υπηρεσιών είναι ό,τι χρησιμοποιεί ο επιλυτής συστήματος - τυπικά το
/etc/services, αλλά NIS, LDAP και άλλα backend υπηρεσιών ονομάτων μπορούν να παρέχουν εγγραφές. Ηsetserventεπανατυλίγει όποια πηγή επιλέξει η βιβλιοθήκη C· το επίπεδο της Perl δεν έχει λόγο σε αυτό.Πλατφόρμες εκτός Unix. Σε συστήματα χωρίς
setservent(3)η κλήση αποτυγχάνει με κράξιμοThe setservent function is unimplemented. Δείτε τοperlportγια τον πίνακα διαθεσιμότητας.Νήματα. Η κατάσταση του επαναλήπτη είναι ανά διεργασία, όχι ανά νήμα· δύο νήματα που διασχίζουν τη βάση δεδομένων υπηρεσιών ταυτόχρονα θα μπλεχτούν και κανένα δεν θα δει όλες τις εγγραφές. Δείτε την κοινή σημείωση στο
perlfuncγια την ασφάλεια νημάτων της οικογένειαςgetpwnam.Ζευγάρωμα με την
endservent. Όταν τοSTAYOPENήταν αληθές, καλέστε τηνendserventγια να απελευθερώσετε τον περιγραφέα αρχείου· αλλιώς το handle διαρρέει για όλη τη ζωή της διεργασίας.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
getservent- διασχίζει τη βάση δεδομένων υπηρεσιών μία εγγραφή τη φορά· αυτός είναι ο επαναλήπτης που επανατυλίγει ηsetserventendservent- κλείνει το αρχείο βάσης δεδομένων υπηρεσιών που άνοιξε ηsetservent 1getservbyname- αναζητά μία υπηρεσία κατ” όνομα· τιμά την κατάσταση ανοιχτό/κλειστό που ορίζεται εδώgetservbyport- αναζητά μία υπηρεσία κατά αριθμό θύρας· ίδια σημασιολογία ανοιχτό/κλειστόsetprotoent- ίδιο μοτίβο για τη βάση δεδομένων πρωτοκόλλων όταν επανατυλίγετε και τις δύο μαζίNet::servent- αντικειμενοστρεφές περιτύλιγμα πάνω από την οικογένειαgetserv*για όταν οι θεσιακές λίστες επιστροφής γίνονται δυσχείριστες