Πληροφορίες χρηστών και ομάδων
setpwent#
Επανατυλίγει τον επαναλήπτη της βάσης δεδομένων passwd ώστε η επόμενη κλήση getpwent να επιστρέψει ξανά την πρώτη εγγραφή.
Η setpwent τυλίγει την κλήση setpwent(3) της βιβλιοθήκης C. (Ξανα)ανοίγει τη βάση δεδομένων passwd του συστήματος και επαναφέρει τον δρομέα επανάληψης που χρησιμοποιεί η getpwent, ώστε ένας επόμενος βρόχος να ξεκινήσει από την αρχή. Χρησιμοποιήστε την όταν θέλετε να επαναλάβετε τη βάση passwd πάνω από μία φορά στην ίδια διεργασία, ή όταν θέλετε να επανεκκινήσετε την επανάληψη μετά από μερική διάσχιση. Συνδυάστε την με endpwent για να απελευθερώσετε τη βάση όταν τελειώσετε.
Σύνοψη#
setpwent;
setpwent();
Τι επιστρέφεται#
Η τιμή επιστροφής δεν είναι χρήσιμη και δεν πρέπει να βασίζεστε σε αυτήν. Στα περισσότερα συστήματα η υποκείμενη setpwent(3) έχει επιστροφή void· η Perl παράγει μια μοναδική ανούσια αληθή τιμή. Καλέστε την setpwent για την παρενέργειά της, ποτέ για την τιμή της.
Καθολική κατάσταση που επηρεάζει#
Τον δρομέα ανά διεργασία που μοιράζονται οι
getpwent,setpwent, καιendpwent. Αυτός ο δρομέας ανήκει στη βιβλιοθήκη C, όχι στην Perl - το fork ενός παιδιού κληρονομεί ένα ανοιχτό handle βάσης δεδομένων, και δύο threads που επαναλαμβάνουν ταυτόχρονα θα διαπλέξουν και θα χάσουν εγγραφές.Η
$!δεν τίθεται από τηνsetpwent· σφάλματα από την υποκείμενηsetpwent(3)καταπίνονται από την πλατφόρμα.
Παραδείγματα#
Επαναλάβετε τη βάση δεδομένων passwd δύο φορές στο ίδιο πρόγραμμα:
while (my @pw = getpwent) {
print "$pw[0]\n"; # first pass: every login name
}
setpwent;
while (my @pw = getpwent) {
print "uid=$pw[2]\n"; # second pass: every uid
}
endpwent;
Επανεκκινήστε την επανάληψη μετά από πρόωρη έξοδο:
while (my @pw = getpwent) {
last if $pw[0] eq 'root';
}
setpwent; # rewind so the next walk sees root again
Τυπικό μοτίβο καθαρισμού - πάντα καλείτε την endpwent όταν τελειώσετε, ανεξάρτητα από το αν καλέσατε την setpwent:
setpwent;
while (my ($name, undef, $uid) = getpwent) {
print "$name => $uid\n" if $uid >= 1000;
}
endpwent;
Οριακές περιπτώσεις#
Κανένα όρισμα. Η
setpwentδεν παίρνει ορίσματα. Η γραφήsetpwent $xείναι συντακτική παγίδα: όπως και άλλοι τελεστές λίστας, θα προσπαθήσει να καταναλώσει την$xως πρώτο στοιχείο μιας λίστας.Πριν από οποιαδήποτε κλήση
getpwent. Ασφαλές. Ηsetpwentανοίγει τη βάση αν δεν είναι ήδη ανοιχτή, οπότε διπλασιάζεται ως ρητή κλήση «open».Μετά την
endpwent. Ασφαλές. Η βάση ξανανοίγει.Forked παιδιά. Κάθε διεργασία έχει τον δικό της δρομέα επανάληψης μετά το fork, αλλά ο υποκείμενος περιγραφέας αρχείου μπορεί να είναι κοινός· διαπλεκόμενες αναγνώσεις από γονέα και παιδί παράγουν εγγραφές που λείπουν ή είναι διπλές. Καλέστε
setpwentστο παιδί για να αποκτήσετε καθαρό επαναλήπτη.Threads. Η επανάληψη της
getpwentείναι ανά διεργασία, όχι ανά thread. Ταυτόχρονη επανάληψη από πολλαπλά threads χάνει εγγραφές. Η upstream Perl αντικαθιστά thread-safe παραλλαγές_rγια τιςgetpwnamκαιgetpwuidόταν η πλατφόρμα τις παρέχει· δεν υπάρχειsetpwent_r, και αυτή η συνάρτηση παραμένει καθολική σε επίπεδο διεργασίας.Βάσεις δεδομένων υποστηριζόμενες από NSS. Σε συστήματα όπου το
/etc/nsswitch.confδρομολογεί τοpasswdμέσω LDAP, SSSD, ή παρόμοιων, ηsetpwentμπορεί να μπλοκάρει σε δικτυακό round-trip. Μην την καλείτε από χειριστές σημάτων ή διαδρομές κώδικα κρίσιμες ως προς την καθυστέρηση.Shadow passwords. Η
setpwentδεν επηρεάζει τον επαναλήπτη shadow-password (αν υπάρχει)· επαναφέρει μόνο την κανονική διάσχισηpasswd.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
getpwent- λάβετε την επόμενη εγγραφή· η συνάρτηση που υπάρχει για να επανατυλίγει ηsetpwentendpwent- απελευθερώστε τη βάση δεδομένων passwd όταν τελειώσετε την επανάληψηgetpwnam- άμεση αναζήτηση με όνομα σύνδεσης· δεν αλληλεπιδρά με τον δρομέα επανάληψηςgetpwuid- άμεση αναζήτηση με uid· δεν αλληλεπιδρά με τον δρομέα επανάληψηςsetgrent- η ίδια λειτουργία επανατυλίγματος για τη βάση δεδομένων ομάδωνUser::pwent- αντικειμενοστραφής περιτυλιγμός που επιστρέφει αντικείμενα με κατονομασμένα πεδία αντί για λίστες 10 στοιχείων