פתרון מסוף ותקציב זמן¶
נוסיף לשומר שדה active: bool שמאותחל ל־true אחרי שינוי מוצלח. המתודה הבאה מצטרפת למימוש RawMode, ו־Drop קורא לה ומתעלם מהשגיאה רק כמסלול ניקוי אחרון.
fn restore(&mut self) -> io::Result<()> {
if !self.active { return Ok(()); }
if unsafe { libc::tcsetattr(self.fd.as_raw_fd(), libc::TCSANOW, &self.original) } == -1 {
return Err(io::Error::last_os_error());
}
self.active = false;
Ok(())
}
השדה מתעדכן רק לאחר שחזור מוצלח, כך שכשל אינו מתחפש למצב משוחזר. חזרה רגילה מפונקציה מפעילה Drop, אבל הריגה שאינה מאפשרת קוד ניקוי אינה עושה זאת. עבור timeout נשמור deadline מחוץ ללולאה ונחשב בכל סיבוב את ההפרש המונוטוני, בלי לשנות אותו עקב יקיצה או כתיבה חלקית.
במפקח PTY, צד ה־master שייך למפקח וצד ה־slave מחובר לקלט ולפלט של הילד לפי פרוטוקול האתחול. מצב המסוף המקומי של המשתמש הוא משאב נוסף ונפרד, ולכן סגירת ה־PTY לבדה אינה משחזרת אותו.