Πληροφορίες χρηστών και ομάδων
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- διαβάστε την επόμενη εγγραφή ομάδας· καταναλώνει τον επαναλήπτη που επανατυλίγει ηsetgrentendgrent- κλείστε τον επαναλήπτη όταν η σάρωση τελειώσει· το συμμετρικό αντίστοιχο τηςsetgrentgetgrnam- αναζήτηση μίας ομάδας με όνομα χωρίς καμία επαφή με τον επαναλήπτη· προτιμήστε την για ερωτήματα μίας εκτέλεσηςgetgrgid- αναζήτηση μίας ομάδας με GID· ίδιο σκεπτικό με τηνgetgrnamsetpwent- το αντίστοιχο επανατύλιγμα για τη βάση δεδομένων passwd