getprotoent#
Λαμβάνει την επόμενη εγγραφή από τη βάση δεδομένων πρωτοκόλλων.
Η getprotoent διασχίζει τη βάση δεδομένων πρωτοκόλλων του συστήματος - σε παραδοσιακά συστήματα τύπου Unix είναι το /etc/protocols, σε σύγχρονα συστήματα ό,τι αντιστοιχίζει σε αυτή η C library και η στοίβα NSS - επιστρέφοντας μία εγγραφή ανά κλήση μέχρι να εξαντληθεί η βάση δεδομένων. Είναι το σκέλος επανάληψης της τριάδας setprotoent / getprotoent / endprotoent. Καταφύγετε στην getprotobyname ή την getprotobynumber όταν θέλετε μια μόνο στοχευμένη αναζήτηση· η getprotoent είναι για απαρίθμηση κάθε πρωτοκόλλου που γνωρίζει το σύστημα.
Ο δρομέας επανάληψης μοιράζεται σε επίπεδο διεργασίας και ανήκει στη C library. Η setprotoent τον επαναφέρει στην αρχή και προαιρετικά καρφώνει ανοιχτό τον υποκείμενο περιγραφέα· η endprotoent τον κλείνει. Μεταξύ αυτών των δύο κλήσεων η getprotoent αποδίδει κάθε εγγραφή με τη σειρά, και μετά επιστρέφει την κενή λίστα (ή undef σε βαθμωτό περιβάλλον) μόλις δεν απομένει τίποτα άλλο.
Σύνοψη#
my ($name, $aliases, $proto) = getprotoent;
my $name = getprotoent;
Τι επιστρέφεται#
Περιβάλλον λίστας - λίστα τριών στοιχείων που αντικατοπτρίζει το C struct protoent:
$name- το κανονικό όνομα πρωτοκόλλου, π.χ."tcp","udp","icmp".$aliases- συμβολοσειρά εναλλακτικών ονομάτων για το ίδιο πρωτόκολλο, διαχωρισμένων με κενά. Συχνά κενή.$proto- ο αριθμητικός αριθμός πρωτοκόλλου όπως χρησιμοποιείται στις κεφαλίδες IP και γίνεται δεκτός από τιςsocket/getsockopt.
Στο τέλος της βάσης δεδομένων η επιστροφή είναι η κενή λίστα. Η σημείωση του upstream perlfunc για «μια μοναδική άνευ νοήματος αληθή τιμή» για απούσες εγγραφές αφορά τις αναζητήσεις κατά όνομα και κατά αριθμό, όχι την getprotoent - η υπέρβαση του τέλους της επανάληψης είναι καθαρή κενή λίστα.
Βαθμωτό περιβάλλον - μόνο το κανονικό $name, ή undef στο τέλος της βάσης δεδομένων. Χρησιμοποιήστε περιβάλλον λίστας όποτε χρειάζεστε τον αριθμό ή τα ψευδώνυμα· δεν μπορείτε να τα ανακατασκευάσετε από το όνομα εκ των υστέρων.
Διασπάστε τα ψευδώνυμα σε λίστα με μια απλή split:
my @alts = split ' ', $aliases;
Καθολική κατάσταση που επηρεάζει#
Ο δρομέας της βάσης δεδομένων πρωτοκόλλων, ένας πόρος ανά διεργασία που ανήκει στη C library και μοιράζεται με τις
setprotoent,endprotoent,getprotobynameκαιgetprotobynumber. Μια αναζήτηση κατά όνομα ή κατά αριθμό μπορεί να επαναφέρει τον δρομέα στη μέση της επανάληψης σε κάποιες πλατφόρμες - δείτε Οριακές περιπτώσεις.Δεν διαβάζονται ή γράφονται ειδικές μεταβλητές σε επίπεδο Perl. Σε αντίθεση με την
gethostent, οι ρουτίνες πρωτοκόλλων δεν έχουν ισοδύναμοh_errno, οπότε η$?δεν θίγεται. Το τέλος της βάσης δεδομένων δεν είναι αποτυχία και δεν θέτει την$!.
Παραδείγματα#
Απαρίθμηση κάθε πρωτοκόλλου που γνωρίζει το σύστημα:
setprotoent(1);
while (my ($name, $aliases, $proto) = getprotoent) {
print "$proto\t$name\t$aliases\n";
}
endprotoent;
Βαθμωτό περιβάλλον - παραθέστε μόνο τα κανονικά ονόματα:
setprotoent(0);
while (defined(my $name = getprotoent)) {
print "$name\n";
}
endprotoent;
Δομήστε αντιστοιχία ονόματος-σε-αριθμό σε ένα πέρασμα ώστε οι μετέπειτα αναζητήσεις να μην χτυπούν καθόλου τη βάση δεδομένων:
my %proto_num;
setprotoent(1);
while (my ($name, $aliases, $num) = getprotoent) {
$proto_num{$name} = $num;
$proto_num{$_} = $num for split ' ', $aliases;
}
endprotoent;
print $proto_num{"tcp"}, "\n"; # 6
Διεπαφή ανά εγγραφή μέσω της παράκαμψης Net::protoent - μέθοδοι προσπέλασης αντί για θεσιακό αποπακετάρισμα:
use Net::protoent;
while (my $p = getprotoent) {
printf "%-10s %3d\n", $p->name, $p->proto;
}
Οριακές περιπτώσεις#
Καμία σιωπηρή επαναφορά. Η
getprotoentδεν ανοίγει ούτε επαναφέρει τη βάση δεδομένων από μόνη της. Η πρώτη κλήση μετά την εκκίνηση του προγράμματος λειτουργεί επειδή η C library ανοίγει το αρχείο τεμπέλικα, αλλά μόλις φτάσει το τέλος, οι επόμενες κλήσεις συνεχίζουν να επιστρέφουν τέλος-βάσης μέχρι μιαsetprotoentνα επαναφέρει τον δρομέα. Πάντα οριοθετήστε την απαρίθμηση με ρητήsetprotoentκαιendprotoent.Το τέλος της βάσης δεδομένων είναι η κενή λίστα, όχι
undef. Σε περιβάλλον λίστας η συνθήκη βρόχουwhile (my @r = getprotoent)λειτουργεί επειδή η κενή λίστα είναι ψευδής. Σε βαθμωτό περιβάλλον χρησιμοποιήστεwhile (defined(my $name = getprotoent))- όνομα πρωτοκόλλου"0"είναι θεωρητικά έγκυρο και θα τερμάτιζε ψευδώς έναν βρόχο που στηρίζεται στην αληθότητα.Τα ψευδώνυμα είναι ένα βαθμωτό, όχι λίστα. Το
$aliasesείναι μία ενιαία συμβολοσειρά διαχωρισμένη με κενά· διασπάστε σε λευκούς χαρακτήρες αν θέλετε λίστα. Κενό πεδίο ψευδωνύμων είναι η συνηθισμένη περίπτωση, όχι σφάλμα.Παρεμβολή με αναζητήσεις κατά όνομα / κατά αριθμό. Μια κλήση σε
getprotobynameήgetprotobynumberκατά τη διάρκεια μιας διάσχισης μπορεί να επαναφέρει τον κοινό δρομέα σε κάποιες πλατφόρμες. Ολοκληρώστε πρώτα την επανάληψη, ή επανεκκινήστε την μεsetprotoentμετά την αναζήτηση.Μη επανεισόδιμη. Ο δρομέας της βάσης δεδομένων είναι ένας μοναδικός καθολικός πόρος μέσα στη C library. Δύο ταυτόχρονες επαναλήψεις στην ίδια διεργασία - σε διαφορετικά threads, χειριστές σήματος ή εμφωλευμένες επιστροφές κλήσεων - διαφθείρουν την κατάσταση η μία της άλλης. Περιορίστε κάθε διάσχιση σε ένα thread τη φορά.
Πλατφόρμες χωρίς βάση δεδομένων πρωτοκόλλων. Σε συστήματα χωρίς ισοδύναμο
/etc/protocols, η κλήση είναι no-op που επιστρέφει αμέσως την κενή λίστα αντί να εγείρει σφάλμα. Δείτε τοperlportγια την πλήρη λίστα ιδιαιτεροτήτων βάσεων δεδομένων δικτύου.Tainting. Οι εγγραφές προέρχονται από αρχείο που διαβάζει ο πυρήνας για λογαριασμό σας και δεν σημειώνονται ως tainted. Αντιμετωπίστε τις ως μη έμπιστες έτσι κι αλλιώς όταν το αρχείο είναι εγγράψιμο από τον χρήστη.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
setprotoent- επαναφέρει τον επαναλήπτη στην αρχή και προαιρετικά καρφώνει ανοιχτό τον υποκείμενο περιγραφέα για όλη τη διάσχισηendprotoent- κλείνει τον επαναλήπτη και απελευθερώνει το handle της βάσης δεδομένων μόλις ολοκληρωθεί η απαρίθμησηgetprotobyname- στοχευμένη αναζήτηση με όνομα πρωτοκόλλου αντί για πλήρη απαρίθμησηgetprotobynumber- στοχευμένη αναζήτηση με αριθμητικό αριθμό πρωτοκόλλουgetservent- ίδιο μοτίβο επανάληψης για τη βάση δεδομένων υπηρεσιών, η οποία αναφέρεται σε ονόματα πρωτοκόλλων από αυτήν εδώgethostent- ίδιο ιδίωμα για τη βάση δεδομένων υπολογιστών