5.4 סיגנלים תרגול
תרגול - סיגנלים¶
תרגיל 1 - תפיסת SIGINT עם מונה¶
כתבו תוכנית שתופסת את הסיגנל SIGINT (שנשלח כשלוחצים Ctrl+C).
- בכל פעם שהתוכנית מקבלת SIGINT, תדפיס הודעה עם מספר הפעם (לדוגמה: "SIGINT #1", "SIGINT #2").
- אחרי שהתוכנית מקבלת 3 סיגנלים של SIGINT, היא תצא.
- השתמשו ב-
sigaction()לרישום הhandler.
תרגיל 2 - טיימר עם alarm¶
כתבו תוכנית שמשתמשת ב-alarm():
- הגדירו טיימר ל-5 שניות באמצעות
alarm(5). - רשמו handler לSIGALRM שמדפיס "!הזמן נגמר" ויוצא מהתוכנית.
- בלולאה הראשית, הדפיסו כל שניה את מספר השניה הנוכחית (1, 2, 3...).
תרגיל 3 - תקשורת בין אב לבן עם SIGUSR1¶
כתבו תוכנית שמשתמשת ב-fork():
- תהליך האב יוצר תהליך בן עם fork.
- תהליך הבן רושם handler לSIGUSR1 שמדפיס הודעה: "הבן קיבל SIGUSR1 מהאב!"
- תהליך הבן ממתין (עם
pause()אוsleep()) לקבלת הסיגנל. - תהליך האב ממתין שניה (כדי שהבן יספיק לרשום את הhandler), ואז שולח SIGUSR1 לבן באמצעות
kill(). - האב ממתין שהבן יסיים עם
wait().
תרגיל 4 - כיבוי נקי עם SIGTERM¶
כתבו תוכנית שמדמה שרת פשוט:
- התוכנית פותחת קובץ לכתיבה בשם "server.log".
- בלולאה, כל שניה כותבת שורה לקובץ: "פעולה מספר X" (כש-X עולה).
- רשמו handler לSIGTERM שמעדכן דגל לעצירה.
- כשהדגל מתעדכן, התוכנית כותבת שורת סיכום לקובץ, סוגרת אותו, ויוצאת.
- הריצו את התוכנית ברקע (
./program &) ושלחו לה SIGTERM עםkill.
תרגיל 5 - שאלה תיאורטית¶
הסבירו: למה אי אפשר לתפוס את SIGKILL? מה היה קורה אם תהליך יכול היה לרשום handler לSIGKILL ולהתעלם ממנו?