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

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 - ανακτά την επόμενη εγγραφή από τον επαναλήπτη που κλείνει η endpwent

  • getpwnam - απευθείας αναζήτηση με όνομα σύνδεσης, ανεξάρτητη από τον επαναλήπτη στις περισσότερες υλοποιήσεις

  • getpwuid - απευθείας αναζήτηση με αριθμητικό UID, η ίδια σημείωση ανεξαρτησίας με την getpwnam

  • endgrent - αναλογική κατάλυση για τον επαναλήπτη της βάσης ομάδων· οι δύο σχεδόν πάντα καλούνται μαζί