endhostent#
סוגר את מסד נתוני המארחים לאחר איטרציה.
endhostent משחרר כל משאבים המוחזקים על־ידי מסד נתוני המארחים לאחר מעבר המונע על־ידי gethostent. הוא מתאים עם sethostent, שפותח או מחזיר לאחור את מסד הנתונים, והוא עטיפה ישירה סביב קריאת ספריית C באותו שם. קריאה לו כאשר אין איטרציה בעיצומה היא לא־מזיקה.
תקציר#
endhostent;
endhostent();
endhostent אינו לוקח ארגומנטים. סוגריים הם אופציונליים.
מה מקבלים בחזרה#
אין ערך החזרה שימושי. הקריאה נעשית בעבור תופעת הלוואי שלה - פירוק כל מצב לכל־תהליך ש־gethostent(3) של הפלטפורמה שומר בין איטרציות (file descriptors באיטרציה מסורתית על /etc/hosts, סוקטי resolver במערכות מבוססות NSS).
מצב גלובלי שהוא נוגע בו#
סמן האיטרציה של מסד נתוני המארחים המשותף ל־
gethostent,sethostent,gethostbyname, ו־gethostbyaddr. לאחרendhostent, הקריאה הבאה ל־gethostentמתחילה מחדש מההתחלה (בדרך כלל לאחרsethostentמשתמע).$?נושא את ערךh_errnoשל ספריית C במערכות שבהן חיפושי מארחים מעלים אותו. רוב המימושים שלendhostentעצמו אינם נוגעים ב־h_errno, אךgethostentעוקב יכול לעשות זאת.
This state is per-process, not per-thread. Two threads iterating hosts concurrently will interleave records and neither will see the full set
pair
sethostent/gethostent/endhostentwithin one thread.
דוגמאות#
סגירת מסד הנתונים לאחר מעבר מלא:
sethostent(1); # 1 = keep connection open
while (my @h = gethostent()) {
print "$h[0]\n"; # canonical hostname
}
endhostent();
תמיד התאם endhostent עם sethostent בתת־שגרה כדי שמצב האיטרציה לא ידלוף לקורא:
sub list_hosts {
sethostent(0);
my @names;
while (my ($name) = gethostent()) {
push @names, $name;
}
endhostent();
return @names;
}
ניקוי הגנתי - endhostent בטוח גם כאשר אין איטרציה בעיצומה, כך שזה תקין לקרוא לו ללא תנאי במסלול שגיאה:
eval {
sethostent(1);
process_hosts();
1;
} or do {
my $err = $@;
endhostent();
die $err;
};
endhostent();
שימוש בממשק עצם ה־accessor לפי שם מ־Net::hostent אינו משנה את הכלל - האיטרטור הבסיסי הוא אותו אחד ש־endhostent סוגר:
use Net::hostent;
sethostent(1);
while (my $h = gethostent()) {
print $h->name, "\n";
}
endhostent();
מקרי קצה#
no-op כשאין דבר פתוח: קריאה ל־
endhostentללאsethostentאוgethostentקודמים מוגדרת ואינה עושה דבר נצפה.שילוב עם חיפושים לפי שם / כתובת: קריאה ל־
gethostbynameאוgethostbyaddrבאמצע איטרציה עלולה לאפס את הסמן בחלק מהפלטפורמות (כל מימוש שקורא פנימית ל־sethostent(0)לחיפושים חד־פעמיים). אל תערבב את שני הסגנונות מול אותו מסד נתונים מבלי לקרוא שוב ל־sethostentלאחר מכן.פלטפורמות ללא איטרטור מארחים: במערכות שה־resolver שלהן אינו תומך במניית רשומות (רוב הגדרות NSS המודרניות שמתשאלות DNS בלבד),
gethostentמחזיר רשימה ריקה מיד.endhostentעדיין ניתן לקריאה ועדיין no-op.בטיחות threads: איטרטור המארחים הוא גלובלי־לתהליך. בתוכנית רב־threads, שמור על שלישיית
sethostent/gethostent/endhostentעם mutex משלך.prototype / פענוח: ל־
endhostentאין ארגומנטים, כך שאין מלכודת עמימות פענוח. כתיבתendhostent LISTהיא שגיאת תחביר ולא מתפרשת בשקט כקריאה עם ארגומנטים.
הבדלים מהמקור#
תאימות מלאה עם Perl 5.42 המקורי.
ראו גם#
sethostent- פותח או מחזיר לאחור את מסד נתוני המארחים; חצי הפתיחה של זוג האיטרציהgethostent- קורא רשומה אחת ממסד הנתונים הפתוח; מחזיר את הרשימה הריקה כאשר האיטרציה מתמצהgethostbyname- חיפוש חד־פעמי לפי שם; אינו דורשsethostent/endhostentgethostbyaddr- חיפוש חד־פעמי לפי כתובתendnetent- אותה תבנית למסד נתוני הרשתותendservent- אותה תבנית למסד נתוני השירותים$?- מקבל אתh_errnoמחיפושי מארחים כושלים בפלטפורמות שספריית C חושפת אותו