לדלג לתוכן

פרויקט מפקח תהליכים עם מסוף ותקציב זמן

בפרויקט הביניים השני נבנה כלי שמריץ תוכנית בתוך PTY, מעביר קלט ופלט, מגביל את זמן העבודה ואוסף את תוצאת הילד. המטרה היא לחבר את כל חוזי הפרק: חיים של מתארים, הצלחת exec, קבוצת תהליכים, מצב מסוף, כתיבה חלקית ומדידת זמן מונוטונית.

הכלי יקבל תקציב זמן במילישניות, נתיב לתוכנית וארגומנטים נפרדים. התוכנית תרוץ ב־session חדשה עם צד ה־slave כמסוף שולט. המפקח יחזיק את צד ה־master, ויעביר נתונים דרך תורים חסומים בגודל מוגדר. אין להניח שכתיבה אחת מעבירה את כל הבאפר, ואין להמתין ליציאת הילד לפני קריאת הפלט שלו.

כאשר הזמן נגמר, הכלי ישלח SIGTERM לקבוצה שנוצרה ויאפשר תקופת חסד קצרה. אם המנהיג עדיין חי, הכלי יסלים ל־SIGKILL וימשיך לאסוף תוצאה. במקרה של כשל מקומי אחרי יצירת הילד, גם מסלול הניקוי חייב לטפל בילד ולא להשאיר אותו ללא בעל אחריות.

מצב המסוף המקומי ודגלי החסימה יישמרו לפני שינוי ויוחזרו במסלולי יציאה רגילים. אין לטעון ששחזור כזה פועל גם אחרי SIGKILL של המפקח. ההגדרה של timeout היא בקשת ביטול לפי שעון מונוטוני, ולא הבטחה שהקרנל יוכל לסיים מייד תהליך שחסום במצב שאינו ניתן להפרעה.

בדקו תוכנית שמדפיסה ויוצאת, תוכנית שמחזירה קוד שאינו אפס, נתיב שאינו קיים, תוכנית אינטראקטיבית ותוכנית שמתעלמת מ־SIGTERM. הוסיפו פלט גדול מגודל התור, stdout איטי וסגירת stdin. תעדו גם מה קורה כאשר תהליך צאצא יוצא מקבוצת התהליכים, משום שהמפקח הזה אינו sandbox.

לאחר סיום המנהיג אפשר לנקז פלט שכבר נמצא ב־PTY, אבל אין להמתין ללא גבול לצאצא ששמר אותו פתוח. הגדירו תקציב ניקוז נפרד ודווחו במפורש אם הפלט נקטע. אל תשתמשו שוב ב־PGID אחרי שאספתם את המנהיג בלי לנתח את אפשרות מחזור הזהות.

הגישו קוד, טבלת תרחישי כשל, תרשים בעלות ומספרי גרסאות. תנאי הסיום הוא שבכל תרחיש יש בעלים לכל מתאר, הילד הישיר נאסף, מצב המסוף משוחזר כשניקוי רגיל אפשרי, כשל טעינה מובחן מקוד סיום, והעברת פלט גדול אינה נתקעת בגלל צינור שלא נקרא.