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

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 setservent as 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 - διασχίζει τη βάση δεδομένων υπηρεσιών μία εγγραφή τη φορά· αυτός είναι ο επαναλήπτης που επανατυλίγει η setservent

  • endservent - κλείνει το αρχείο βάσης δεδομένων υπηρεσιών που άνοιξε η setservent 1

  • getservbyname - αναζητά μία υπηρεσία κατ” όνομα· τιμά την κατάσταση ανοιχτό/κλειστό που ορίζεται εδώ

  • getservbyport - αναζητά μία υπηρεσία κατά αριθμό θύρας· ίδια σημασιολογία ανοιχτό/κλειστό

  • setprotoent - ίδιο μοτίβο για τη βάση δεδομένων πρωτοκόλλων όταν επανατυλίγετε και τις δύο μαζί

  • Net::servent - αντικειμενοστρεφές περιτύλιγμα πάνω από την οικογένεια getserv* για όταν οι θεσιακές λίστες επιστροφής γίνονται δυσχείριστες