מידע רשת

endnetent#

סוגר את מסד נתוני הרשתות לאחר איטרציה.

endnetent משחרר את המשאבים שמסד נתוני הרשתות מחזיק - בדרך כלל הקובץ /etc/networks או מקבילתו מגובת NSS - שנפתחו באופן מובלע בקריאה הראשונה ל־getnetent, getnetbyname או getnetbyaddr, או במפורש על־ידי setnetent. לאחר endnetent סמן האיטרציה נעלם; קריאה עוקבת ל־getnetent מתחילה סריקה רעננה מראש מסד הנתונים. זהו עטיפה דקה מעל endnetent(3) של ספריית ה־C של המערכת.

תקציר#

endnetent;
endnetent();

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

ערך אמת מוגדר־מערכת. פונקציית ה־C מחזירה void; Perl מציפה placeholder כדי שהקריאה תוכל לעמוד כהוראה. אל תשווה את ערך ההחזרה לדבר - אין בו דבר שימושי.

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

endnetent פועל על סמן מסד־נתוני־הרשתות הכלל־תהליכי שבבעלות libc. אותו סמן משותף עם getnetent, getnetbyname, getnetbyaddr ו־setnetent; קריאה כאן מבטלת את מצב האיטרציה שאותן פונקציות תלויות בו. אין משתנה Perl מיוחד שנגוע.

דוגמאות#

משולב עם setnetent ו־getnetent לסריקה מלאה של מסד נתוני הרשתות:

setnetent(1);                       # stayopen = 1
while (my @net = getnetent()) {
    my ($name, $aliases, $addrtype, $net) = @net;
    print "$name\t$net\n";
}
endnetent();                        # release the cursor

סגירה לאחר קומץ החיפושים שבאמת נזקקת להם, כדי שקובץ מסד הנתונים לא יישאר פתוח לכל יתר התוכנית:

setnetent(0);
my @loopback = getnetbyname("loopback");
my @link     = getnetbyname("link-local");
endnetent();

בטוח לקרוא כאשר מסד הנתונים מעולם לא נפתח - libc מתייחסת לזה כ־no-op:

endnetent();                        # harmless on a fresh process

מקרי קצה#

  • ללא ארגומנטים, קדימות של אופרטור־רשימה. endnetent אינו מקבל ארגומנטים אך מתפרסר כאופרטור־רשימה, כך שאיבר תועה לאחריו נבלע: endnetent $x הוא endnetent($x) ומפיק שגיאת זמן־הידור ״Too many arguments״. כתוב endnetent; או endnetent();.

  • קריאות חוזרות. קריאה ל־endnetent פעמיים ברצף היא no-op בקריאה השנייה בכל libc שאנו מכוונים אליה. אל תסתמך על כך שהיא תעלה שגיאה.

  • שילוב עם איטרטורי DB אחרים. סמן הרשתות עצמאי מהסמנים המשמשים את getpwent, getgrent, gethostent, getprotoent ו־getservent. endnetent אינו סוגר אותם - קרא ל־end*ent המתאים לכל איטרטור שפתחת.

  • ביצוע fork בין setnetent ל־endnetent. הסמן שוכן במצב ה־libc של ההורה; ילד יורש אותו בזמן fork אך קריאות getnetent נוספות בכל אחד מהתהליכים יוצאות מסנכרון. סגור ופתח מחדש בילד.

  • מקורות NSS. ב־glibc מסד נתוני הרשתות מנותב דרך NSS, כך שמשמעות ״סגירה״ תלויה בשירות המוגדר (files, nis, ldap, …). ההתנהגות הגלויה למשתמש - איטרציה מתחילה מחדש ב־getnetent הבא - זהה; עלות endnetent אינה.

  • בטיחות thread. סמן הרשתות של libc הוא משאב יחיד גלובלי לתהליך. pperl אינו מבצע סריאליזציה של הגישה אליו; תוכנית שמבצעת איטרציה על מסד נתוני הרשתות ממספר threads חייבת לבצע נעילה משלה.

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42.

ראו גם#

  • setnetent - פותח את מסד נתוני הרשתות ובוחר האם הוא יישאר פתוח בין חיפושים בודדים

  • getnetent - קורא את הרשומה הבאה מהסמן ש־endnetent סוגר

  • getnetbyname - חיפוש בודד לפי שם רשת; פותח את מסד הנתונים באופן מובלע אך אינו סוגר אותו

  • getnetbyaddr - חיפוש בודד לפי כתובת מספרית, אותו כלל של פתיחה־מובלעת ללא־סגירה־מובלעת

  • endhostent - המקבילה למסד־נתוני־המארחים; אותה תבנית, סמן עצמאי

  • endservent - המקבילה למסד־נתוני־השירותים לשם שלמות משפחת end*ent