Πληροφορίες χρηστών και ομάδων

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 - λάβετε την επόμενη εγγραφή· η συνάρτηση που υπάρχει για να επανατυλίγει η setpwent

  • endpwent - απελευθερώστε τη βάση δεδομένων passwd όταν τελειώσετε την επανάληψη

  • getpwnam - άμεση αναζήτηση με όνομα σύνδεσης· δεν αλληλεπιδρά με τον δρομέα επανάληψης

  • getpwuid - άμεση αναζήτηση με uid· δεν αλληλεπιδρά με τον δρομέα επανάληψης

  • setgrent - η ίδια λειτουργία επανατυλίγματος για τη βάση δεδομένων ομάδων

  • User::pwent - αντικειμενοστραφής περιτυλιγμός που επιστρέφει αντικείμενα με κατονομασμένα πεδία αντί για λίστες 10 στοιχείων