לדלג לתוכן

5.4 סיגנלים תרגול

תרגול - סיגנלים

תרגיל 1 - תפיסת SIGINT עם מונה

כתבו תוכנית שתופסת את הסיגנל SIGINT (שנשלח כשלוחצים Ctrl+C).

  1. בכל פעם שהתוכנית מקבלת SIGINT, תדפיס הודעה עם מספר הפעם (לדוגמה: "SIGINT #1", "SIGINT #2").
  2. אחרי שהתוכנית מקבלת 3 סיגנלים של SIGINT, היא תצא.
  3. השתמשו ב-sigaction() לרישום הhandler.

תרגיל 2 - טיימר עם alarm

כתבו תוכנית שמשתמשת ב-alarm():

  1. הגדירו טיימר ל-5 שניות באמצעות alarm(5).
  2. רשמו handler לSIGALRM שמדפיס "!הזמן נגמר" ויוצא מהתוכנית.
  3. בלולאה הראשית, הדפיסו כל שניה את מספר השניה הנוכחית (1, 2, 3...).

תרגיל 3 - תקשורת בין אב לבן עם SIGUSR1

כתבו תוכנית שמשתמשת ב-fork():

  1. תהליך האב יוצר תהליך בן עם fork.
  2. תהליך הבן רושם handler לSIGUSR1 שמדפיס הודעה: "הבן קיבל SIGUSR1 מהאב!"
  3. תהליך הבן ממתין (עם pause() או sleep()) לקבלת הסיגנל.
  4. תהליך האב ממתין שניה (כדי שהבן יספיק לרשום את הhandler), ואז שולח SIGUSR1 לבן באמצעות kill().
  5. האב ממתין שהבן יסיים עם wait().

תרגיל 4 - כיבוי נקי עם SIGTERM

כתבו תוכנית שמדמה שרת פשוט:

  1. התוכנית פותחת קובץ לכתיבה בשם "server.log".
  2. בלולאה, כל שניה כותבת שורה לקובץ: "פעולה מספר X" (כש-X עולה).
  3. רשמו handler לSIGTERM שמעדכן דגל לעצירה.
  4. כשהדגל מתעדכן, התוכנית כותבת שורת סיכום לקובץ, סוגרת אותו, ויוצאת.
  5. הריצו את התוכנית ברקע (./program &) ושלחו לה SIGTERM עם kill.

תרגיל 5 - שאלה תיאורטית

הסבירו: למה אי אפשר לתפוס את SIGKILL? מה היה קורה אם תהליך יכול היה לרשום handler לSIGKILL ולהתעלם ממנו?