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