מידע רשת

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 - חיפוש־נקודה לפי כתובת; אותה הסתייגות כמו ל־gethostbyname

  • setnetent - בן־הזוג למסד־נתוני־הרשתות, אותה תבנית איטרציה

  • setservent - בן־הזוג למסד־נתוני־השירותים