מידע רשת

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 setservent as 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 1

  • getservbyname - מחפש שירות יחיד לפי שם; מכבד את מצב פתוח/סגור שנקבע כאן

  • getservbyport - מחפש שירות יחיד לפי מספר פורט; אותה סמנטיקה של פתוח/סגור

  • setprotoent - אותו דפוס למסד נתוני הפרוטוקולים כשאתם מחזירים לאחור את שניהם יחד

  • Net::servent - עטיפה מונחית־עצמים מעל משפחת getserv* כאשר רשימות החזרה מיקומיות נעשות מסורבלות