setpwent#
מחזיר לאחור את האיטרטור של מסד נתוני הסיסמאות כך שקריאת getpwent הבאה מחזירה שוב את הרשומה הראשונה.
setpwent עוטף את הקריאה setpwent(3) של ספריית ה־C. הוא (פותח מחדש) פותח את מסד נתוני הסיסמאות של המערכת ומאפס את סמן האיטרציה שבשימוש getpwent, כך שלולאה עוקבת מתחילה מלמעלה. השתמשו בו כשאתם רוצים לעבור על מסד נתוני הסיסמאות יותר מפעם אחת באותו תהליך, או כשאתם רוצים להפעיל מחדש איטרציה לאחר הליכה חלקית. שייכו אותו עם endpwent לשחרר את מסד הנתונים בסיום.
תקציר#
setpwent;
setpwent();
מה מקבלים בחזרה#
ערך־ההחזרה אינו שימושי ואין להסתמך עליו. ברוב המערכות ל־setpwent(3) הבסיסי יש החזרת void; Perl מניב ערך אמת חסר־משמעות יחיד. קראו ל־setpwent בשל תופעת הלוואי שלו, לעולם לא בשל ערכו.
מצב גלובלי שהוא נוגע בו#
דוגמאות#
איטרציה על מסד נתוני הסיסמאות פעמיים באותה תוכנית:
while (my @pw = getpwent) {
print "$pw[0]\n"; # first pass: every login name
}
setpwent;
while (my @pw = getpwent) {
print "uid=$pw[2]\n"; # second pass: every uid
}
endpwent;
הפעלה מחדש של איטרציה לאחר יציאה מוקדמת:
while (my @pw = getpwent) {
last if $pw[0] eq 'root';
}
setpwent; # rewind so the next walk sees root again
דפוס ניקוי טיפוסי - קראו תמיד ל־endpwent בסיום, בין אם קראתם ל־setpwent ובין אם לאו:
setpwent;
while (my ($name, undef, $uid) = getpwent) {
print "$name => $uid\n" if $uid >= 1000;
}
endpwent;
מקרי קצה#
ללא ארגומנטים.
setpwentאינו מקבל ארגומנטים. כתיבתsetpwent $xהיא מלכודת תחבירית: כמו אופרטורי רשימה אחרים, הוא ינסה לצרוך את$xכאיבר הראשון של רשימה.לפני כל קריאת
getpwent. בטוח.setpwentפותח את מסד הנתונים אם אינו כבר פתוח, ולכן הוא משמש גם כקריאת ״פתח״ מפורשת.לאחר
endpwent. בטוח. מסד הנתונים נפתח מחדש.ילדים שעברו fork. לכל תהליך יש סמן איטרציה משלו לאחר ה־fork, אך file descriptor הבסיסי עשוי להיות משותף; קריאות משולבות מהורה וילד מפיקות רשומות חסרות או כפולות. קראו ל־
setpwentבילד כדי לקבל איטרטור נקי.Threads. איטרציה של
getpwentהיא לכל־תהליך, לא לכל־thread. איטרציה בו־זמנית ממספר threadים מאבדת רשומות. Perl ב־upstream מחליף לוריאנטים_rבטוחים־ל־thread עבורgetpwnamו־getpwuidכשהפלטפורמה מספקת אותם; איןsetpwent_r, והפונקציה הזו נשארת גלובלית־לתהליך.מסדי נתונים מגובי־NSS. במערכות שבהן
/etc/nsswitch.confמנתב אתpasswdדרך LDAP, SSSD, או דומה,setpwentעלול להיחסם בנסיעת חזור של רשת. אל תקראו אליו ממטפלי אותות או ממסלולי קוד קריטיים מבחינת latency.סיסמאות shadow.
setpwentאינו משפיע על האיטרטור של סיסמאות shadow (אם יש); הוא מאפס רק את ההליכה הרגילה שלpasswd.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
getpwent- שולף את הרשומה הבאה; הפונקציה ש־setpwentקיימת כדי להחזיר לאחורendpwent- משחרר את מסד נתוני הסיסמאות כשסיימתם איטרציהgetpwnam- חיפוש ישיר לפי שם התחברות; אינו מקיים אינטראקציה עם סמן האיטרציהgetpwuid- חיפוש ישיר לפי uid; אינו מקיים אינטראקציה עם סמן האיטרציהsetgrent- אותה פעולת רוויינד עבור מסד נתוני הקבוצותUser::pwent- עטיפה מונחית־עצמים המחזירה עצמים בעלי־שדות־עם־שם במקום רשימות של 10 איברים