setprotoent#
Ανοίγει τη βάση δεδομένων πρωτοκόλλων και την προετοιμάζει για σειριακές αναγνώσεις.
Η setprotoent επανατυλίγει (ή ανοίγει) τη βάση δεδομένων πρωτοκόλλων του συστήματος - στα περισσότερα Unix-like συστήματα αυτό είναι το /etc/protocols - ώστε μια επόμενη ακολουθία κλήσεων getprotoent να ξεκινήσει από την πρώτη εγγραφή. Είναι το πρώτο σκέλος της τριάδας επανάληψης setprotoent / getprotoent / endprotoent. Το μοναδικό όρισμα STAYOPEN είναι hint προς τη βιβλιοθήκη C για το αν το file handle που υποστηρίζει την επανάληψη πρέπει να μένει ανοιχτό μεταξύ κλήσεων: αληθής τιμή ζητάει από τη βιβλιοθήκη να το κρατήσει ανοιχτό (γρηγορότερο για μακρές διασχίσεις), ψευδής τιμή της επιτρέπει να κλείνει και να ξανανοίγει ανά κλήση.
Η κλήση των getprotobyname ή getprotobynumber σε οποιοδήποτε σημείο στη μέση της επανάληψης μπορεί να επαναφέρει τη θέση διάσχισης σε ορισμένες πλατφόρμες· δείτε Οριακές περιπτώσεις.
Σύνοψη#
setprotoent STAYOPEN
setprotoent(1)
Τι επιστρέφεται#
Καμία ουσιαστική τιμή επιστροφής. Όπως και οι συγγενείς της endprotoent και sethostent, η setprotoent καλείται για την παρενέργειά της: επανατύλιγμα της επανάληψης και, ανάλογα με το STAYOPEN, καθήλωση του περιγραφέα ανοιχτού. Δεν υπάρχει τίποτα που να αξίζει να ελέγξετε στην τιμή επιστροφής της.
Καθολική κατάσταση που επηρεάζει#
Η setprotoent χειρίζεται έναν ανά διεργασία δρομέα στη βάση δεδομένων πρωτοκόλλων που ανήκει στη βιβλιοθήκη C. Αυτή η κατάσταση μοιράζεται σε κάθε επόμενη κλήση getprotoent στην ίδια διεργασία - συμπεριλαμβανομένων κλήσεων από άλλα αρθρώματα που δεν γράψατε εσείς. Κώδικας που διασχίζει τη βάση πρέπει είτε να την αποστραγγίσει πλήρως με την endprotoent είτε να δεχτεί ότι ένας μεταγενέστερος καλών μπορεί να δει μια επανάληψη ήδη σε εξέλιξη. Δεν διαβάζονται ή γράφονται ειδικές μεταβλητές σε επίπεδο Perl.
Παραδείγματα#
Ανοίξτε τη βάση και επαναλάβετε κάθε εγγραφή, κρατώντας τον υποκείμενο περιγραφέα ζωντανό για όλη τη διάσχιση:
setprotoent(1); # 1 = keep file open between calls
while (my @p = getprotoent()) {
my ($name, $aliases, $proto) = @p;
print "$proto\t$name\n";
}
endprotoent();
Επανεκκινήστε μια εν εξελίξει επανάληψη από την αρχή:
setprotoent(1);
my @first = getprotoent();
my @second = getprotoent();
setprotoent(1); # rewind
my @again = getprotoent(); # same as @first
endprotoent();
Αφήστε τη βιβλιοθήκη C να κλείνει και να ξανανοίγει το /etc/protocols σε κάθε getprotoent - φθηνότερο σε μνήμη, ακριβότερο σε κλήσεις συστήματος, χρήσιμο μόνο όταν διαβάζετε λίγες εγγραφές:
setprotoent(0);
my @tcp = getprotoent();
endprotoent();
Συνδυάστε με αναζήτηση μίας εκτέλεσης - οι getprotobyname και getprotobynumber δεν συμμετέχουν στην επανάληψη και δεν χρειάζονται setprotoent:
my @tcp = getprotobyname('tcp'); # no setprotoent needed
Οριακές περιπτώσεις#
Το
STAYOPENείναι hint, όχι συμβόλαιο: πολλές βιβλιοθήκες C το αγνοούν εντελώς και συμπεριφέρονται σαν ο περιγραφέας να μένει πάντα ανοιχτός. Μη βασίζεστε στο όρισμα για έλεγχο της χρήσης πόρων σε λεπτομερές επίπεδο.Ανάμειξη με αναζητήσεις μίας εκτέλεσης: η κλήση των
getprotobynameήgetprotobynumberκατά τη διάρκεια διάσχισης μπορεί να επαναφέρει τον δρομέα επανάληψης σε ορισμένες πλατφόρμες. Φορητός κώδικας αποστραγγίζει πρώτα τη διάσχιση, ή ξανακαλεί τηνsetprotoentμετά για να ξεκινήσει από την αρχή.Μη επανεισόδιμη: ο δρομέας της βάσης δεδομένων πρωτοκόλλων είναι ένας μόνο καθολικός πόρος μέσα στη βιβλιοθήκη C. Δύο ταυτόχρονες επαναλήψεις στην ίδια διεργασία (threads, χειριστές σημάτων, οτιδήποτε) αλληλοαλλοιώνονται. Χρησιμοποιήστε μία διάσχιση τη φορά.
Το όρισμα είναι υποχρεωτικό σε επίπεδο γλώσσας: η
setprotoentχωρίς όρισμα είναι συντακτικό σφάλμα - η ενσωματωμένη έχει πληθικότητα ένα. Περάστε0αν δεν έχετε προτίμηση.Πλατφόρμες χωρίς βάση δεδομένων πρωτοκόλλων: σε συστήματα όπου η βιβλιοθήκη C δεν έχει αντίστοιχο του
/etc/protocols, η κλήση είναι no-op αντί για σφάλμα. Δείτε τοperlportγια την πλήρη λίστα ιδιορρυθμιών βάσης δεδομένων δικτύου.Μη tainted αποτέλεσμα της επανάληψης: οι εγγραφές που επιστρέφει η
getprotoentμετά τηνsetprotoentπροέρχονται από αρχείο που διαβάζει ο πυρήνας εκ μέρους σας και δεν σημειώνονται ως tainted. Παρ” όλα αυτά αντιμετωπίστε τες ως μη έμπιστες αν η βάση μπορεί να επεξεργαστεί από χρήστες.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
getprotoent- διαβάστε την επόμενη εγγραφή· το σώμα του βρόχου που στήνει ηsetprotoentendprotoent- κλείστε τη βάση μετά την επανάληψη· ο τερματιστής για την τριάδα που ξεκινάει ηsetprotoentgetprotobyname- αναζήτηση μίας εκτέλεσης με όνομα· δεν συμμετέχει στην επανάληψηgetprotobynumber- αναζήτηση μίας εκτέλεσης με αριθμό πρωτοκόλλου· ομοίως ανεξάρτητηsethostent- αντίστοιχη opener για τη βάση δεδομένων υπολογιστών· ίδιο ιδίωμα, διαφορετικός πίνακαςsetservent- αντίστοιχη opener για τη βάση δεδομένων υπηρεσιών