setnetent#
פותח או מחזיר לאחור את מסד נתוני הרשתות לאיטרציה.
setnetent מכין את מסד נתוני הרשתות של המערכת כך שקריאות עוקבות ל־getnetent מחזירות רשומות החל מהראשונה. זוהי עטיפה ישירה סביב setnetent(3) של ספריית C והוא קורא מאותו מקור בסיסי כמו קריאת ה־C - בדרך כלל /etc/networks ב־Linux, או מכל ש־nsswitch.conf / backends של NSS הוגדרו לספק.
The STAYOPEN argument is a hint to the C library: a true value asks it to keep the database file open across related calls (getnetbyname, getnetbyaddr, getnetent) so individual lookups do not each pay the cost of opening and closing the file. On modern glibc this flag is effectively ignored - the database is handled efficiently either way
but passing it costs nothing and keeps the code portable to systems where it still matters.
תקציר#
setnetent STAYOPEN
setnetent 0
setnetent 1
מה מקבלים בחזרה#
setnetent אינו מחזיר דבר משמעותי. בהקשר רשימה הוא מחזיר רשימה ריקה, בהקשר סקלר undef. אל תסתמך על ערך ההחזרה; השפעת הקריאה היא תופעת הלוואי של מיקום איטרטור מסד הנתונים בהתחלה.
אם קריאת C הבסיסית נכשלת (לדוגמה קובץ מסד הנתונים חסר או לא־קריא) השגיאה היא שקטה מנקודת המבט של Perl - getnetent פשוט יחזיר רשימה ריקה בקריאה הראשונה.
מצב גלובלי שהוא נוגע בו#
סמן מסד־נתוני־הרשתות הכלל־תהליכי המתוחזק על־ידי ספריית C. כל קריאה ל־
getnetentמקדמת את הסמן הזה;setnetentמחזיר אותו לאחור.endnetentסוגר את מסד הנתונים ומשחרר כל משאבים המוחזקים על־ידי רמזSTAYOPEN.לא נקראים או נכתבים משתנים מיוחדים של Perl.
מאחר שהסמן הוא לכל־תהליך, לא לכל־thread, שילוב איטרציה על מסד נתוני הרשתות ממספר threads באותו מפרש ישחית את מיקום כל איטרטור. בצע את האיטרציה מ־thread יחיד, או סדר את הגישה.
דוגמאות#
החזרה לאחור של מסד הנתונים ואיטרציה מהרשומה הראשונה:
setnetent(1);
while (my ($name, $aliases, $addrtype, $net) = getnetent()) {
printf "%-20s %d\n", $name, $net;
}
endnetent();
הרצה מחדש של האיטרציה מהראש ללא סגירה בין לבין. ה־setnetent השני מחזיר לאחור, כך שהלולאה השנייה רואה כל רשומה שוב:
setnetent(1);
my @first_pass = collect_nets();
setnetent(1);
my @second_pass = collect_nets();
endnetent();
sub collect_nets {
my @out;
while (my @ent = getnetent()) { push @out, $ent[0] }
return @out;
}
התאמה עם Net::netent לממשק שדות־בעלי־שם על אותו מקור נתונים - setnetent עדיין שולט בסמן:
use Net::netent;
setnetent(1);
while (my $n = getnetent()) {
printf "%s -> %s\n", $n->name, $n->net;
}
endnetent();
מקרי קצה#
STAYOPENהוא רמז, לא הבטחה. במערכות שבהן ספריית C מתעלמת ממנו, העברת1והעברת0מפיקות התנהגות נצפית זהה.אין
setnetentמשתמע לפניgetnetent. תהליך רענן שקורא ל־getnetentמבלי לקרוא תחילה ל־setnetentעדיין מתחיל מהרשומה הראשונה ברוב המערכות, אך זוהי מוסכמה של libc ולא הבטחה. קרא ל־setnetentבמפורש כשאתה רוצה להיות בטוח.קריאה ל־
setnetentבאמצע איטרציה מחזירה את הסמן לאחור. כל לולאתwhile (getnetent)בעיצומה מתחילה מחדש מהראש - שימושי למעבר שני מכוון, באג אם זה קורה בטעות מתת־שגרת עזר שגם מבצעת איטרציה.אינטראקציה עם
getnetbyname/getnetbyaddr. במערכות שבהן ספריית C מכבדתSTAYOPEN, חיפוש לפי שם או לפי כתובת במהלך איטרציה לא יפריע לאיטרטור. במערכות המתעלמות מהרמז, כל חיפוש עשוי לאפס את הסמן. אל תערבב חיפושים לפי שם עם איטרצייתgetnetentאם אתה צריך מיקום יציב.הרשאות. מסד נתוני הרשתות בדרך כלל קריא לכולם, אך backends של NSS (LDAP,
sssd) עשויים לכפות הרשאה משלהם. חיפוש שעבד כ־rootעלול להניב כלום כמשתמש רגיל מבלי ש־Perl רואה שגיאה./etc/networksריק או חסר. ברוב מערכות Linux קובץ זה ריק או חסר כברירת מחדל.setnetentעדיין מצליח; ה־getnetentשלאחריו מחזיר רשימה ריקה בקריאה הראשונה. זה אינו תנאי שגיאה.
הבדלים מהמקור#
תאימות מלאה עם Perl 5.42 המקורי.
ראו גם#
getnetent- האיטרטור שמופעל על־ידיsetnetent; מושיט יד לשורה הבאה בכל קריאהendnetent- סוגר את מסד הנתונים ומשחרר כל משאבים שהוחזקו פתוחים על־ידיSTAYOPEN; קרא לו כשהאיטרציה הסתיימהgetnetbyname- מחפש רשומה אחת לפי שם מבלי להריץ את האיטרטורgetnetbyaddr- מחפש רשומה אחת לפי כתובת ארוזה מבלי להריץ את האיטרטורsethostent- אותו אידיום למסד נתוני המארחיםsetservent- אותו אידיום למסד נתוני השירותיםNet::netent- עטיפה מונחית־עצמים שמחזירה שדות בעלי שם במקום רשימה מיקומית