פתרון אותות בהקשר רגיל¶
המונה נוסף בתוך הלולאה אחרי חזרת sigwait. הוא סופר אירועים שנמסרו במסלול שלנו, ואינו מתיימר לשחזר כל שליחה שבוצעה מחוץ לתהליך.
let mut received = 0usize;
loop {
let mut signal = 0;
let status = unsafe { libc::sigwait(&set, &mut signal) };
if status != 0 { return Err(io::Error::from_raw_os_error(status)); }
if signal == libc::SIGTERM { break; }
if signal == libc::SIGUSR1 {
received += 1;
println!("received={received}");
}
}
הקטע מחליף את לולאת ההרצאה ומשתמש ב־set שהוכן לפניה. עבור self-pipe, חוזה של בקשת עצירה מתאחדת יכול לשמור מצב עצירה נפרד ולהשתמש בצינור רק כדי להעיר את הלולאה. כתיבה לצינור מלא אינה מחייבת איבוד המצב, אבל צריך להשתמש במנגנון מצב שמותר בהקשר אות ולנהל את חייו יחד עם ה־handler.
המתאר של signalfd שייך ללולאה, והאותות נשארים חסומים בתהליכונים שעלולים לקבל אותם אחרת. סגירת המתאר אינה זהה להסרת החסימה, ולכן שלב הסיום חייב להגדיר מה קורה לאותות pending ולמדיניות לאחר הפסקת הלולאה.