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

setpwent#

מחזיר לאחור את האיטרטור של מסד נתוני הסיסמאות כך שקריאת getpwent הבאה מחזירה שוב את הרשומה הראשונה.

setpwent עוטף את הקריאה setpwent(3) של ספריית ה־C. הוא (פותח מחדש) פותח את מסד נתוני הסיסמאות של המערכת ומאפס את סמן האיטרציה שבשימוש getpwent, כך שלולאה עוקבת מתחילה מלמעלה. השתמשו בו כשאתם רוצים לעבור על מסד נתוני הסיסמאות יותר מפעם אחת באותו תהליך, או כשאתם רוצים להפעיל מחדש איטרציה לאחר הליכה חלקית. שייכו אותו עם endpwent לשחרר את מסד הנתונים בסיום.

תקציר#

setpwent;
setpwent();

מה מקבלים בחזרה#

ערך־ההחזרה אינו שימושי ואין להסתמך עליו. ברוב המערכות ל־setpwent(3) הבסיסי יש החזרת void; Perl מניב ערך אמת חסר־משמעות יחיד. קראו ל־setpwent בשל תופעת הלוואי שלו, לעולם לא בשל ערכו.

מצב גלובלי שהוא נוגע בו#

  • הסמן לכל־תהליך המשותף ל־getpwent, setpwent ו־endpwent. סמן זה בבעלות ספריית ה־C, לא של Perl - fork של ילד נירש מטפל פתוח של מסד הנתונים, ושני threadים שמבצעים איטרציה בו־זמנית ישתלבו ויאבדו רשומות.

  • $! אינו נקבע על־ידי setpwent; שגיאות מ־setpwent(3) הבסיסי נבלעות על־ידי הפלטפורמה.

דוגמאות#

איטרציה על מסד נתוני הסיסמאות פעמיים באותה תוכנית:

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 איברים