מידע רשת

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 / endhostent within 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 / endhostent

  • gethostbyaddr - חיפוש חד־פעמי לפי כתובת

  • endnetent - אותה תבנית למסד נתוני הרשתות

  • endservent - אותה תבנית למסד נתוני השירותים

  • $? - מקבל את h_errno מחיפושי מארחים כושלים בפלטפורמות שספריית C חושפת אותו