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

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 - αντικειμενοστραφές περιτύλιγμα που επιστρέφει ονομασμένα πεδία αντί για λίστα κατά θέση