endpwent#
סוגר את איטרטור מסד־נתוני־הסיסמאות שנפתח על־ידי getpwent או setpwent.
endpwent הוא קריאת הפירוק הנלווית לסריקת קובץ־סיסמאות. לאחר איטרציה על מסד נתוני הסיסמאות בקריאות getpwent חוזרות, endpwent משחרר כל מצב לכל־תהליך שספריית ה־C הקצתה כדי להחזיק את סמן האיטרציה (file descriptor פתוח על /etc/passwd, buffer ממוטמן ל־NSS, חיבור ל־nscd / sssd, סשן LDAP, בהתאם להגדרת שירות־השמות של המארח). הוא לא מקבל ארגומנטים ועוטף את קריאת endpwent(3) של המערכת ישירות.
תקציר#
endpwent
מה מקבלים בחזרה#
ערך בוליאני יחיד. ההחזרה נבדקת לעתים נדירות - בכל פלטפורמה ש־PetaPerl תומך בה, endpwent אינו יכול להיכשל באופן משמעותי, וקוד אמיתי מתייחס אליו כקריאת void.
מצב גלובלי שהוא נוגע בו#
endpwent אינו משנה אף משתנה גלוי ל־Perl. המצב שהוא מנקה כולו בתוך ספריית ה־C: איטרטור הסיסמאות לכל־תהליך, משותף עם getpwent ו־setpwent (ובמערכות מסוימות גם עם getpwnam / getpwuid כאשר אלה משתמשים מחדש באותו זרם שמתחת). קריאה ל־endpwent ב־thread אחד משפיעה על כל thread אחר באותו תהליך - האיטרטור הוא לכל־תהליך, לא לכל־thread.
דוגמאות#
ניב סטנדרטי של איטרציה־ואז־סגירה:
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- רק סמן האיטרטור נסגר.בטיחות thread. האיטרטור הוא לכלל־התהליך. אם שני threads סורקים את מסד נתוני הסיסמאות בו־זמנית,
endpwentסוגר את הסמן המשותף לשניהם - אף אחד מה־threads לא יקבל את ערכת הרשומות המלאה. השתמש בנעילה סביב כל בלוקsetpwent/ לולאה /endpwentכאשר מבצעים איטרציה מתוך threads.מקורות שירות־שמות. על מארחים המשתמשים ב־LDAP, NIS,
sssdאו בכל מקור אחר שאינו קובץ־שטוח,endpwentעשוי לשחרר מטפל רשת. דמון ארוך־ריצה שמבצע איטרציה על מסד נתוני הסיסמאות מעת לעת צריך לקרוא ל־endpwentבסוף כל מעבר ולא להדליף מטפל אחד לכל מעבר.אינו השטפת מטמון מאולצת.
endpwentסוגר את האיטרטור; הוא אינו משטיף את מטמוניgetpwnam/getpwuidשל ספריית ה־C.getpwnamעוקב עדיין עשוי להחזיר רשומה ממוטמנת.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
setpwent- מחזיר לאחור או פותח את איטרטור מסד־נתוני־הסיסמאות לפני סריקה; משתלב עםendpwentכסוגר הפותח/סוגרgetpwent- מאחזר את הרשומה הבאה מהאיטרטור ש־endpwentסוגרgetpwnam- חיפוש ישיר לפי שם התחברות, עצמאי מהאיטרטור ברוב המימושיםgetpwuid- חיפוש ישיר לפי UID מספרי, אותה הערת עצמאות כמו ל־getpwnamendgrent- פירוק מקביל לאיטרטור מסד־נתוני־הקבוצות; השניים נקראים כמעט תמיד יחד