Πληροφορίες χρηστών και ομάδων
endpwent#
Κλείνει τον επαναλήπτη της βάσης passwd που άνοιξε από τις getpwent ή setpwent.
Η endpwent είναι η συντροφική κλήση κατάλυσης για ένα πέρασμα του αρχείου passwd. Μετά την επανάληψη της βάσης κωδικών με επανειλημμένες κλήσεις getpwent, η endpwent απελευθερώνει όποια κατάσταση ανά διεργασία είχε δεσμεύσει η βιβλιοθήκη C για να συγκρατήσει τον δρομέα επανάληψης (έναν ανοιχτό περιγραφέα αρχείου στο /etc/passwd, ένα ταμιευμένο buffer για NSS, μια σύνδεση σε nscd / sssd, μια συνεδρία LDAP, αναλόγως της ρύθμισης υπηρεσίας ονομάτων του υπολογιστή). Δεν παίρνει ορίσματα και περιτυλίγει απευθείας τη συστημική κλήση endpwent(3).
Σύνοψη#
endpwent
Τι επιστρέφεται#
Μια μοναδική λογική τιμή. Η επιστροφή σπάνια ελέγχεται - σε κάθε πλατφόρμα που υποστηρίζει το PetaPerl, η endpwent δεν μπορεί να αποτύχει με ουσιαστικό τρόπο, και ο πραγματικός κώδικας τη μεταχειρίζεται ως κλήση void.
Καθολική κατάσταση που αγγίζει#
Η endpwent δεν μεταλλάσσει καμία μεταβλητή ορατή στην Perl. Η κατάσταση που εκκαθαρίζει είναι εξ ολοκλήρου μέσα στη βιβλιοθήκη C: ο επαναλήπτης passwd ανά διεργασία, που μοιράζεται με τις getpwent και setpwent (και, σε ορισμένα συστήματα, με τις getpwnam / getpwuid όταν τυχαίνει να επαναχρησιμοποιούν το ίδιο υποκείμενο ρεύμα). Η κλήση της endpwent σε ένα νήμα επηρεάζει κάθε άλλο νήμα στην ίδια διεργασία - ο επαναλήπτης είναι ανά διεργασία, όχι ανά νήμα.
Παραδείγματα#
Τυπικός ιδιωματισμός επανάληψης-και-κλεισίματος:
setpwent;
while (my @ent = getpwent) {
my ($name, undef, $uid) = @ent;
print "$uid\t$name\n";
}
endpwent;
Εξασφαλίστε ότι ο επαναλήπτης κλείνει ακόμη και αν ο βρόχος βγει νωρίς:
setpwent;
eval {
while (my @ent = getpwent) {
my ($name, undef, $uid, $gid) = @ent;
die "found it\n" if $uid == $target;
}
};
endpwent; # always run, regardless of how the loop ended
Συνδυάστε με μια φύλαξη local ώστε ο εμφωλευμένος κώδικας να μην μπορεί να αφήσει τον επαναλήπτη μισο-διανυσμένο:
sub each_user {
my $cb = shift;
setpwent;
my $guard = Guard::guard { endpwent }; # or a manual eval-and-rethrow
while (my @ent = getpwent) { $cb->(@ent) }
}
Η endpwent χωρίς προηγούμενη επανάληψη είναι αβλαβής:
endpwent; # no-op on a fresh process
Οριακές περιπτώσεις#
Χωρίς ορίσματα, χωρίς ανάγκη παρενθέσεων. Η
endpwentείναι επώνυμος μοναδιαίος τελεστής με μηδέν ορίσματα· γράψτε την σκέτη. Ηendpwent()γίνεται δεκτή αλλά δεν προσθέτει τίποτα.Ταυτοδύναμη. Η κλήση της
endpwentδύο φορές στη σειρά, ή η κλήση της πριν από οποιαδήποτεgetpwent/setpwent, ορίζεται ως επιτυχημένο no-op σε κάθε υποστηριζόμενη πλατφόρμα.Δεν ακυρώνει εγγραφές που έχετε ήδη ανακτήσει. Πίνακες και πίνακες κατακερματισμού που επέστρεψαν προηγούμενες κλήσεις
getpwent/getpwnam/getpwuidείναι σκέτα δεδομένα της Perl και παραμένουν έγκυρα μετά τηνendpwent- μόνο ο δρομέας επανάληψης κλείνει.Ασφάλεια νημάτων. Ο επαναλήπτης είναι καθολικός σε επίπεδο διεργασίας. Αν δύο νήματα διατρέχουν τη βάση passwd ταυτόχρονα, η
endpwentκλείνει τον κοινό δρομέα και για τα δύο - κανένα νήμα δεν θα λάβει το πλήρες σύνολο εγγραφών. Χρησιμοποιήστε κλείδωμα γύρω από ολόκληρο το μπλοκsetpwent/ βρόχος /endpwentόταν επαναλαμβάνετε από νήματα.Υποστρώματα υπηρεσίας ονομάτων. Σε υπολογιστές που χρησιμοποιούν LDAP, NIS,
sssdή οποιοδήποτε άλλο μη-flat-file υπόστρωμα, ηendpwentμπορεί να απελευθερώσει έναν δικτυακό χειριστή. Ένας μακρόβιος δαίμονας που επαναλαμβάνει τη βάση passwd περιοδικά πρέπει να καλεί τηνendpwentστο τέλος κάθε περάσματος αντί να διαρρέει έναν χειριστή ανά πέρασμα.Δεν είναι αναγκαστική εκκένωση κρυφής μνήμης. Η
endpwentκλείνει τον επαναλήπτη· δεν εκκενώνει τις κρυφές μνήμεςgetpwnam/getpwuidτης βιβλιοθήκης C. Μια επόμενηgetpwnamμπορεί να επιστρέψει ακόμη εγγραφή από την κρυφή μνήμη.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
setpwent- επανατυλίγει ή ανοίγει τον επαναλήπτη της βάσης passwd πριν από ένα πέρασμα· συνεργάζεται με τηνendpwentως αγκύλη ανοίγματος/κλεισίματοςgetpwent- ανακτά την επόμενη εγγραφή από τον επαναλήπτη που κλείνει ηendpwentgetpwnam- απευθείας αναζήτηση με όνομα σύνδεσης, ανεξάρτητη από τον επαναλήπτη στις περισσότερες υλοποιήσειςgetpwuid- απευθείας αναζήτηση με αριθμητικό UID, η ίδια σημείωση ανεξαρτησίας με τηνgetpwnamendgrent- αναλογική κατάλυση για τον επαναλήπτη της βάσης ομάδων· οι δύο σχεδόν πάντα καλούνται μαζί