setservent#
מחזיר לאחור את מסד נתוני השירותים ושומר אותו פתוח אופציונלית בין חיפושים.
setservent הוא המקבילה של מסד נתוני השירותים ל־setservent(3) של ספריית ה־C. הוא מאפס את הסמן הפנימי שבשימוש getservent כך שהקריאה הבאה מתחילה שוב ברשומה הראשונה של /etc/services (או מקור אחר שהפותר של המערכת מוגדר להשתמש בו), והוא בוקר האם הקובץ הבסיסי נשאר פתוח בין חיפושים לפי־שם ולפי־פורט.
תקציר#
setservent STAYOPEN
setservent 0 # close file between lookups (default)
setservent 1 # keep file open across lookups
מה מקבלים בחזרה#
The return value is whatever the underlying C setservent(3) returns
on most systems that’s nothing useful, and scripts do not check it. Treat
setserventas called for its side effect on the iterator, not for a value.
מצב גלובלי שהוא נוגע בו#
סמן מסד נתוני השירותים לכל־תהליך המשותף ל־
getservent,getservbyname,getservbyportו־endservent. כל ארבעתם קוראים ומשנים את אותו מצב; האיטרציה אינה בטוחה־ל־thread ואינה reentrant.סטטוס פתוח/סגור של קובץ מסד נתוני השירותים.
STAYOPENאמת משאיר את הקובץ פתוח עד שנקראים ל־endservent;STAYOPENשקר (ברירת המחדל) גורם לכל חיפוש לפי־שם או לפי־פורט עוקב לפתוח ולסגור שוב את הקובץ.
הארגומנט STAYOPEN#
העבירו ערך אמת כדי להחזיק את הקובץ פתוח על־פני סדרת חיפושי getservbyname או getservbyport בודדים. זה אופטימיזציה לפתרון אצווה, לא שינוי סמנטי: התוצאות זהות בשני המקרים.
setservent 1;
for my $name (@service_names) {
my @svc = getservbyname $name, "tcp";
# ... process @svc ...
}
endservent;
העבירו ערך שקר (או 0) כשאתם רוצים שכל חיפוש יפתח מחדש את הקובץ. זוהי התנהגות ברירת המחדל וזו שרוב התוכניות רוצות.
דוגמאות#
הליכה על כל רשומה במסד נתוני השירותים והדפסת זוגות שם/פורט:
setservent 0;
while (my ($name, undef, $port, $proto) = getservent) {
print "$name $port/$proto\n";
}
endservent;
החזרה לאחור באמצע איטרציה כדי להתחיל מחדש:
setservent 0;
my @first_pass;
while (my @svc = getservent) {
push @first_pass, $svc[0];
last if @first_pass == 10;
}
setservent 0; # cursor back to start
my @second_pass = getservent; # first entry again
endservent;
פתרון באצווה כשהקובץ מוחזק פתוח:
my @wanted = qw(http https ssh smtp);
setservent 1;
my %port = map { $_ => scalar getservbyname($_, "tcp") } @wanted;
endservent;
מקרי קצה#
STAYOPENנדרש ברמת Perl.setserventמפורסר עם קדימות של אופרטור־רשימה וקורא ארגומנט אחד;setservent;חשוף ללא ארגומנט הוא שגיאת זמן הידור. העבירו0כשאתם רוצים את התנהגות ברירת המחדל ״סגור לאחר כל חיפוש״.תלות פלטפורמה. מסד נתוני השירותים הוא מה שהפותר של המערכת משתמש בו - בדרך כלל
/etc/services, אך NIS, LDAP, ושאר backends של שירות־שמות יכולים לספק רשומות.setserventמחזיר לאחור את המקור שספריית ה־C בוחרת; לרמת Perl אין אמירה בעניין.פלטפורמות שאינן Unix. במערכות ללא
setservent(3)הקריאה זורקת חריגה עםThe setservent function is unimplemented. ראוperlportלמטריצת הזמינות.Threads. מצב האיטרטור הוא לכל־תהליך, לא לכל־thread; שני threadים שמהלכים על מסד נתוני השירותים בו־זמנית ישתלבו ואף אחד מהם לא יראה כל רשומה. ראו את ההערה המשותפת ב־
perlfuncעל בטיחות־thread של משפחתgetpwnam.שיוך עם
endservent. כאשרSTAYOPENהיה אמת, קראו ל־endserventלשחרר את ה־file descriptor; אחרת המטפל זולג למשך חיי התהליך.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
getservent- הליכה במסד נתוני השירותים רשומה אחר רשומה; זהו האיטרטור ש־setserventמחזיר לאחורendservent- סוגר את קובץ מסד נתוני השירותים שנפתח על־ידיsetservent 1getservbyname- מחפש שירות יחיד לפי שם; מכבד את מצב פתוח/סגור שנקבע כאןgetservbyport- מחפש שירות יחיד לפי מספר פורט; אותה סמנטיקה של פתוח/סגורsetprotoent- אותו דפוס למסד נתוני הפרוטוקולים כשאתם מחזירים לאחור את שניהם יחדNet::servent- עטיפה מונחית־עצמים מעל משפחתgetserv*כאשר רשימות החזרה מיקומיות נעשות מסורבלות