מידע משתמש וקבוצה

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 מספרי, אותה הערת עצמאות כמו ל־getpwnam

  • endgrent - פירוק מקביל לאיטרטור מסד־נתוני־הקבוצות; השניים נקראים כמעט תמיד יחד