sethostent#
פותח או מבצע rewind למסד נתוני המארחים לצורך איטרציה.
sethostent מכין את מסד נתוני המארחים של המערכת (בדרך כלל /etc/hosts בתוספת כל מקורות שירות־שמות שמוגדרים על־ידי הפלטפורמה) לסריקה סדרתית עם gethostent, ומבצע rewind לסמן אם איטרציה כבר בעיצומה. STAYOPEN הוא דגל המועבר לקריאת C sethostent(3) שמתחת: ערך אמת מבקש מהמפענח לשמור את מסד הנתונים פתוח בין חיפושי gethostby* עוקבים, מה שעל מערכות מסוימות נמנע מפתיחה־מחדש של הקובץ או מחיבור־מחדש לשירות־השמות עבור כל שאילתה.
תקציר#
sethostent STAYOPEN
sethostent 0
sethostent 1
מה מקבלים בחזרה#
אינו מחזיר דבר שימושי. הקריאה מופעלת עבור תופעת־הלוואי שלה של הכנת האיטרטור; התעלם מערך ההחזרה.
מצב גלובלי שהוא נוגע בו#
משנה מצב מפענח גלובלי לתהליך שמתוחזק על־ידי ספריית ה־C: ה־file descriptor של מסד־נתוני־המארחים או מטפל שירות־השמות, וסמן האיטרציה לכל־תהליך שנקרא על־ידי gethostent. שני קטעי קוד באותו תהליך הסורקים את מסד נתוני המארחים בו־זמנית ידרכו זה על זה - יש סמן אחד, לא אחד לכל קורא. בכישלון $! נקבע על־ידי קריאת המערכת שמתחת; אין דיווח בסגנון h_errno לפונקציה זו.
דוגמאות#
סריקת כל רשומה במסד נתוני המארחים:
sethostent(0);
while (my ($name, $aliases, $addrtype, $length, @addrs)
= gethostent()) {
print "$name\n";
}
endhostent();
בקש מהמפענח לשמור את מסד הנתונים פתוח בעוד אצווה של חיפושים משם־לכתובת רצה, ואז סגור אותו:
sethostent(1);
for my $host (@hosts) {
my $packed = gethostbyname($host);
# ...
}
endhostent();
ביצוע rewind לאיטרציה בעיצומה כדי להתחיל מחדש מהרשומה הראשונה:
sethostent(0);
my $first = (gethostent())[0];
sethostent(0); # back to the top
my $first_again = (gethostent())[0];
מקרי קצה#
STAYOPENהוא תחביר חובה, לא סמנטיקה חובה. הארגומנט חייב להיות נוכח -sethostent;היא שגיאת הידור - אך פלטפורמות רבות מתעלמות מהדגל ותמיד שומרות את מסד הנתונים פתוח לאורך האיטרציה. העבר0כשאין לך העדפה.לא לכל פלטפורמה יש איטרטור מארחים משמעותי. במערכות שבהן מסד נתוני המארחים מוגש בלעדית על־ידי DNS או על־ידי שירות־שמות שאינו חושף מנייה,
gethostentמחזיר את הרשימה הריקה בקריאה הראשונה ללא תלות ב־sethostent. הקריאה עצמה עדיין מצליחה.בטיחות thread. סמן המפענח הוא לכל־תהליך, לא לכל־thread. שני threads המבצעים איטרציה במקביל ישלבו רשומות ואף אחד מהם לא יראה את הרשימה המלאה. Perl ב־upstream מחליף וריאנטים של
*_rעבור חיפושי־נקודה כמוgethostbynameהיכן שזמינים; אין וריאנט בטוח־ל־thread של האיטרטור.אינטראקציה עם מטמוני
gethostby*. במימושי libc מסוימיםsethostent(1)שמופעל לפני גל של קריאותgethostbyname/gethostbyaddrשומר את הקובץ שמתחת פתוח בין שאילתות; באחרים אין לו השפעה. מדוד לפני שתסתמך עליו כאופטימיזציה.שלב עם
endhostent. השארת מסד הנתונים פתוח לאחר איטרציה עלולה להדליף file descriptor או חיבור מפענח. תמיד סגור את הסריקה עםendhostent.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
gethostent- קורא את הרשומה הבאה ממסד נתוני המארחים לאחר ש־sethostentהכין את הסמןendhostent- סוגר את מסד הנתונים ומשחרר את מצב המפענח כשהאיטרציה הסתיימהgethostbyname- חיפוש־נקודה לפי שם; נהנה מ־sethostent(1)על פלטפורמות שמכבדות אותוgethostbyaddr- חיפוש־נקודה לפי כתובת; אותה הסתייגות כמו ל־gethostbynamesetnetent- בן־הזוג למסד־נתוני־הרשתות, אותה תבנית איטרציהsetservent- בן־הזוג למסד־נתוני־השירותים