setnetent#
Ανοίγει ή επαναφέρει στην αρχή τη βάση δεδομένων δικτύων για επανάληψη.
Η setnetent προετοιμάζει τη βάση δεδομένων δικτύων του συστήματος ώστε οι επόμενες κλήσεις στην getnetent να επιστρέφουν εγγραφές ξεκινώντας από την πρώτη. Είναι άμεσο περιτύλιγμα της setnetent(3) της C library και διαβάζει την ίδια υποκείμενη πηγή με την κλήση C - τυπικά το /etc/networks στο Linux, ή ό,τι έχουν διαμορφωθεί να παρέχουν τα nsswitch.conf / backends NSS.
The STAYOPEN argument is a hint to the C library: a true value asks it to keep the database file open across related calls (getnetbyname, getnetbyaddr, getnetent) so individual lookups do not each pay the cost of opening and closing the file. On modern glibc this flag is effectively ignored - the database is handled efficiently either way
but passing it costs nothing and keeps the code portable to systems where it still matters.
Σύνοψη#
setnetent STAYOPEN
setnetent 0
setnetent 1
Τι επιστρέφεται#
Η setnetent δεν επιστρέφει τίποτα ουσιαστικό. Σε περιβάλλον λίστας επιστρέφει κενή λίστα, σε βαθμωτό περιβάλλον undef. Μη βασίζεστε στην τιμή επιστροφής· η επίδραση της κλήσης είναι η παρενέργεια της τοποθέτησης του επαναλήπτη της βάσης στην αρχή.
Αν η υποκείμενη κλήση C αποτύχει (για παράδειγμα το αρχείο της βάσης δεδομένων λείπει ή είναι μη αναγνώσιμο) το σφάλμα είναι σιωπηρό από τη σκοπιά της Perl - η getnetent απλώς θα επιστρέψει κενή λίστα στην πρώτη κλήση.
Καθολική κατάσταση που επηρεάζει#
Τον δρομέα βάσης δικτύων που είναι καθολικός σε επίπεδο διεργασίας και διατηρείται από τη C library. Κάθε κλήση στην
getnetentπροωθεί αυτόν τον δρομέα· ηsetnetentτον επαναφέρει στην αρχή. Ηendnetentκλείνει τη βάση δεδομένων και απελευθερώνει όποιους πόρους κρατά μια υπόδειξηSTAYOPEN.Δεν διαβάζεται ούτε γράφεται καμία ειδική μεταβλητή της Perl.
Επειδή ο δρομέας είναι ανά διεργασία, όχι ανά thread, η διαπλοκή επανάληψης βάσης δεδομένων δικτύων από πολλά threads στον ίδιο διερμηνέα θα αλλοιώσει τη θέση κάθε επαναλήπτη. Εκτελέστε την επανάληψη από ένα μόνο thread, ή σειριοποιήστε την πρόσβαση.
Παραδείγματα#
Επαναφορά της βάσης δεδομένων και επανάληψη από την πρώτη εγγραφή:
setnetent(1);
while (my ($name, $aliases, $addrtype, $net) = getnetent()) {
printf "%-20s %d\n", $name, $net;
}
endnetent();
Επανεκτέλεση της επανάληψης από την κορυφή χωρίς κλείσιμο στο ενδιάμεσο. Η δεύτερη setnetent επαναφέρει στην αρχή, οπότε ο δεύτερος βρόχος βλέπει κάθε εγγραφή ξανά:
setnetent(1);
my @first_pass = collect_nets();
setnetent(1);
my @second_pass = collect_nets();
endnetent();
sub collect_nets {
my @out;
while (my @ent = getnetent()) { push @out, $ent[0] }
return @out;
}
Ζευγάρωμα με το Net::netent για διεπαφή ονομασμένων πεδίων πάνω από την ίδια πηγή δεδομένων - η setnetent εξακολουθεί να ελέγχει τον δρομέα:
use Net::netent;
setnetent(1);
while (my $n = getnetent()) {
printf "%s -> %s\n", $n->name, $n->net;
}
endnetent();
Οριακές περιπτώσεις#
Το
STAYOPENείναι υπόδειξη, όχι εγγύηση. Σε συστήματα όπου η C library το αγνοεί, το πέρασμα1και το πέρασμα0παράγουν πανομοιότυπη παρατηρήσιμη συμπεριφορά.Καμία σιωπηρή
setnetentπριν τηνgetnetent. Φρέσκια διεργασία που καλεί τηνgetnetentχωρίς να καλέσει πρώτα τηνsetnetentεξακολουθεί να ξεκινά από την πρώτη εγγραφή στα περισσότερα συστήματα, αλλά αυτό είναι σύμβαση της libc και όχι εγγύηση. Καλέστε ρητά τηνsetnetentόταν θέλετε να είστε σίγουροι.Η κλήση
setnetentστη μέση της επανάληψης επαναφέρει τον δρομέα. Οποιοσδήποτε εν εξελίξει βρόχοςwhile (getnetent)ξαναξεκινά από την κορυφή - χρήσιμο για σκόπιμη δεύτερη διέλευση, bug αν συμβεί κατά λάθος από βοηθητική sub που επίσης επαναλαμβάνει.Αλληλεπίδραση με
getnetbyname/getnetbyaddr. Σε συστήματα όπου η C library τιμά τοSTAYOPEN, μια αναζήτηση βάσει ονόματος ή διεύθυνσης κατά τη διάρκεια της επανάληψης δεν θα διαταράξει τον επαναλήπτη. Σε συστήματα που αγνοούν την υπόδειξη, κάθε αναζήτηση μπορεί να επαναφέρει τον δρομέα. Μην αναμιγνύετε αναζητήσεις βάσει ονόματος με επανάληψηgetnetentαν χρειάζεστε σταθερή τοποθέτηση.Δικαιώματα. Η βάση δεδομένων δικτύων είναι τυπικά αναγνώσιμη από όλους, αλλά τα backends NSS (LDAP,
sssd) μπορεί να επιβάλλουν τη δική τους εξουσιοδότηση. Μια αναζήτηση που δούλεψε ωςrootμπορεί να μην αποδώσει τίποτα ως κανονικός χρήστης χωρίς η Perl να δει σφάλμα.Κενό ή ελλείπον
/etc/networks. Στα περισσότερα συστήματα Linux αυτό το αρχείο είναι κενό ή απουσιάζει εξ ορισμού. Ηsetnetentεξακολουθεί να πετυχαίνει· η ακόλουθηgetnetentεπιστρέφει κενή λίστα στην πρώτη κλήση. Αυτό δεν είναι κατάσταση σφάλματος.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
getnetent- ο επαναλήπτης που προετοιμάζει ηsetnetent· σε κάθε κλήση πιάνει την επόμενη γραμμήendnetent- κλείνει τη βάση δεδομένων και απελευθερώνει όποιους πόρους κρατά ανοιχτούς τοSTAYOPEN· καλέστε την όταν η επανάληψη ολοκληρωθείgetnetbyname- αναζήτηση μίας εγγραφής βάσει ονόματος χωρίς εκτέλεση του επαναλήπτηgetnetbyaddr- αναζήτηση μίας εγγραφής βάσει πακεταρισμένης διεύθυνσης χωρίς εκτέλεση του επαναλήπτηsethostent- το ίδιο ιδίωμα για τη βάση δεδομένων υπολογιστώνsetservent- το ίδιο ιδίωμα για τη βάση δεδομένων υπηρεσιώνNet::netent- αντικειμενοστραφές περιτύλιγμα που επιστρέφει ονομασμένα πεδία αντί για λίστα κατά θέση