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

setgrent#

Επανατυλίγει τον επαναλήπτη της βάσης δεδομένων ομάδων πίσω στην πρώτη εγγραφή.

Η setgrent λέει στον επαναλήπτη της βάσης δεδομένων ομάδων του συστήματος να ξεκινήσει από την αρχή. Η επόμενη κλήση στην getgrent επιστρέφει ξανά την πρώτη εγγραφή ομάδας, ανεξάρτητα από το πόσο μακριά είχε φτάσει η προηγούμενη επανάληψη. Δεν παίρνει ορίσματα, δεν επιστρέφει χρήσιμη τιμή, και υπάρχει ώστε ένα πρόγραμμα να μπορεί να ξανασαρώσει τη βάση ομάδων χωρίς να χρειαστεί να την κλείσει και να την ξανανοίξει χειροκίνητα. Συνδυάστε την με την endgrent στο τέλος μιας σάρωσης για να απελευθερώσετε τον υποκείμενο περιγραφέα αρχείου.

Σύνοψη#

setgrent;
setgrent();

Τι επιστρέφεται#

Η τιμή επιστροφής δεν είναι προδιαγεγραμμένη και κατά σύμβαση αγνοείται. Καλέστε την setgrent για την παρενέργειά της - την τοποθέτηση του επαναλήπτη - όχι για την τιμή της.

Καθολική κατάσταση που επηρεάζει#

  • Τον επαναλήπτη βάσης δεδομένων ομάδων ανά διεργασία που διατηρείται από τη βιβλιοθήκη C (getgrent(3)). Είναι καθολικός σε επίπεδο διεργασίας, χωρίς εμβέλεια πακέτου ή λεξιλογικής εμβέλειας: οποιοσδήποτε άλλος κώδικας διασχίζει την getgrent στην ίδια διεργασία, συμπεριλαμβανομένων threads που μοιράζονται τον επαναλήπτη, βλέπει το επανατύλιγμα.

  • Η $! - σε συστήματα των οποίων η setgrent(3) αναφέρει σφάλματα (σπάνιο· οι περισσότερες υλοποιήσεις επιστρέφουν void), μια αποτυχία αφήνει την errno τεθειμένη. Φορητός κώδικας δεν βασίζεται σε αυτό.

Η setgrent δεν αγγίζει την $_, τον @ARGV, ή οποιοδήποτε filehandle.

Παραδείγματα#

Επανατύλιγμα μεταξύ δύο διασχίσεων της βάσης δεδομένων ομάδων - πρώτα για συλλογή όλων των ονομάτων ομάδων, μετά για συλλογή των μελών μιας συγκεκριμένης ομάδας:

my @names;
while (my @g = getgrent) {
    push @names, $g[0];
}

setgrent;                           # start over
while (my @g = getgrent) {
    next unless $g[0] eq 'wheel';
    print "wheel members: $g[3]\n";
    last;
}
endgrent;

Χρησιμοποιήστε setgrent στην αρχή μιας sub που καλείται επανειλημμένα και θέλει φρέσκια σάρωση κάθε φορά:

sub groups_containing {
    my ($user) = @_;
    setgrent;
    my @groups;
    while (my ($name, undef, undef, $members) = getgrent) {
        push @groups, $name if grep { $_ eq $user } split / /, $members;
    }
    endgrent;
    return @groups;
}

Συνδυάστε setgrent / endgrent γύρω από μια σάρωση ώστε ένας άσχετος καλών που βρισκόταν στη μέση επανάληψης να μην αιφνιδιαστεί όταν ο έλεγχος επιστρέψει:

setgrent;
while (my @g = getgrent) {
    # ... process ...
}
endgrent;

Οριακές περιπτώσεις#

  • Μόνο η μορφή χωρίς ορίσματα. Σε αντίθεση με τις sethostent, setnetent, setprotoent, και setservent, που παίρνουν σημαία STAYOPEN, η setgrent δεν παίρνει τίποτα. Η μετάδοση ορίσματος είναι σφάλμα κατά τη μεταγλώττιση.

  • Η κλήση της setgrent χωρίς ενδιάμεση getgrent είναι no-op στα περισσότερα συστήματα - ο επαναλήπτης απλώς τοποθετείται στην πρώτη εγγραφή, και η πρώτη getgrent μετά διαβάζει αυτή την εγγραφή. Μη βασίζεστε στην setgrent ως πρωτογενή λειτουργία «άνοιγμα του αρχείου ομάδων»· η μόνη ορισμένη συμπεριφορά της είναι «επανατύλιγμα».

  • Καθολική κατάσταση σε επίπεδο διεργασίας. Η setgrent μέσα σε ένα άρθρωμα επανατυλίγει τον επαναλήπτη για κάθε άλλο άρθρωμα στην ίδια διεργασία. Αν μια βιβλιοθήκη διασχίσει την getgrent μέχρι το τέλος και ένας καλών μετά καλέσει setgrent, ο δρομέας της βιβλιοθήκης έχει χαθεί. Αντιμετωπίστε τον επαναλήπτη ως κοινόχρηστο πόρο: κρατήστε τον για τη διάρκεια μιας σάρωσης, οριοθετημένο από setgrent και endgrent.

  • Τα threads μοιράζονται τον επαναλήπτη. Δύο threads που καλούν getgrent ταυτόχρονα θα δουν το καθένα ένα υποσύνολο των εγγραφών· η setgrent από ένα thread ενοχλεί το άλλο. Για επανάληψη ανά thread, διαβάστε απευθείας το /etc/group ή χρησιμοποιήστε thread-safe περιτυλιγμό· η ενσωματωμένη δεν είναι επανεισόδιμη.

  • Δεν την υλοποιούν όλες οι πλατφόρμες πανομοιότυπα. Σε συστήματα χωρίς setgrent(3) η κλήση είναι no-op και πετυχαίνει σιωπηλά. Σε συστήματα που την υλοποιούν, το ακριβές κόστος (επανάνοιγμα του /etc/group, επανεκκίνηση ενός ερωτήματος NSS, επανερώτηση LDAP) εξαρτάται από την υποκείμενη υπηρεσία ονομάτων και μπορεί να είναι μη ασήμαντο - αποφύγετε την κλήση σε σφιχτό βρόχο.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • getgrent - διαβάστε την επόμενη εγγραφή ομάδας· καταναλώνει τον επαναλήπτη που επανατυλίγει η setgrent

  • endgrent - κλείστε τον επαναλήπτη όταν η σάρωση τελειώσει· το συμμετρικό αντίστοιχο της setgrent

  • getgrnam - αναζήτηση μίας ομάδας με όνομα χωρίς καμία επαφή με τον επαναλήπτη· προτιμήστε την για ερωτήματα μίας εκτέλεσης

  • getgrgid - αναζήτηση μίας ομάδας με GID· ίδιο σκεπτικό με την getgrnam

  • setpwent - το αντίστοιχο επανατύλιγμα για τη βάση δεδομένων passwd