סיגנלים

 

   הרעיונות שב- XINU מומשו ע"י הרוטינות kill, suspend, resume ממומשות ב-UNIX תחת הכותרת של מושג הסיגנלים.  סיגנל הוא מעין איתות הנשלח לתהליך.  בכל מערכת UNIX יש סידרה קבועה של מספרי סיגנלים אפשריים. התהליך המקבל סיגנל יכול לדעת רק שקיבל סיגנל, ואת המספר הסידורי של הסיגנל.  זוהי כל  האינפורמציה שהמנגנון הזה מעביר.

 

  סיגנלים נשלחים ע"י רוטינת המערכת kill.   למעט תהליכים של ה-root, תהליך יכול לשלוח סיגנל רק לתהליכים ששיכים לאותו user כמו התהליך המנסה לשלוח את הסיגנל.  התגובה של תהליך המקבל סיגנל הוא בדרך כלל לחדול מלהתקיים.  אולם עבור מרבית הסיגנלים (חוץ משניים), תהליך יכול לשנות את התגובה שלו לסיגנל.  הוא יכול להתעלם מהסיגנל (SIG_IGN) , לחזור לברירת המחדל ((SIG_DFL או להפעיל רוטינה פרטית משלו כ"מטפל בסיגנל".  האפקטים הזה מתקבלים ע"י קריאה לרוטינת המערכת signal.  ברוב מערכות UNIX ההשפעה של קריאה לרוטינה signal  עם רוטינת טיפול בסיגנל (להבדיל מהתעלמות או ברירת מחדל) היא חד פעמית.  ברגע שמתרחש סיגנל מהסוג שבו מדובר, והטיפול נעשה ע"י הרוטינה החדשה, הטיפול בסיגנל חוזר לטיפול הסטנדרטי או ברירת המחדל.  דרך למנוע זאת הוא במסגרת הטיפול לקרוא שוב ל-signal, אך זה לא אמין אם מקור הסיגנלים הוא אלקטרוני (להבדיל מאנושי) משום שיתכן שהקריאה החדשה לרוטינה signal לא תעשה בזמן.  הרוטינה signal  מחזירה פוינטר למטפל הקודם של הסיגנל.  קריאה אופיינית לרוטינת  סיגנל היא

signal(SIGINT, SIG_IGN);

 

  לסיכום אפשר לומר שמנגנון הסיגנלים של התהליכים מזכיר במידה רבה את מנגנון הפסיקות של המכונה.

 

   סוגי סיגנלים

 

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

 

  סיגנלים גם יכולים להישלח לתהליך ע"י המשתמש:  אם המשתמש מריץ תוכנית משורת הפקודה (שלא ברקע) הוא יכול לשלוח את הסיגנל SIGINT ע"י לחיצת Ctrl-C ו-SIGQUIT ע"י לחיצת Ctrl-\, או SIGTSTP ע"י לחיצת Ctrl-Z.  האחרון אגב, משהה את התהליך, לא הורג אותו.

 

   את כל הסיגנלים ניתן לשלוח משורת הפקודה למשל

%  kill –QUIT 1877

או מתוך תוכנית C למשל,

kill(pid, SIGQUIT)

 

ישנם שני סיגנלים שמהם אי אפשר להתעלם מהם או ללכוד:

SIGKILL – סיגנל שמחסל את התהליך (כמעט) בכל מקרה,

 

SIGSTOP – סיגנל שעוצר את התהליך (כמעט) בכל מקרה.

 

  גם חידוש תהליך מושהה נעשה ע"י סיגנל – SIGCONT.

 

ישנם סיגנלים שברירת המחדל שלהם היא להתעלם מהם (SIGCONT, SIGCHLD, SIGSYS).

 

SIGTERM – סיגנל שנשלח ע"י תוכנה, שהשימוש העיקרי שלו היא לשמש בקשה "מנומסת" לתהליך לסיים במהירות (למשל ב-shutdown).  במקרה כזה ניתן לתכנת תהליך לרדת בצורה מסודרת, תוך שמירת מידע למשל.

 

SIGHUP   במידה והמערכת מאבדת קשר עם המשתמש (למשל מישהוא כיבה את המסוף), הסיגנל הזה נשלח לכל התהליכים שהוא יצר ב-session הזה.  בדרך כלל המשמעות היא חיסול התהליכים הללו.

 

הרוטינה kill  מחזיר  0   במקרה של קריאה  חוקית ל-kill ו-1- במקרה של קריאה בלתי חוקית.

 

  ערכים מיוחדים ל-kill

 

 ביצוע kill  עם מספר סיגנל אפס –  הרוטינה רק בודקת את חוקיות מספר התהליך.

 

ביצוע kill  עם יעד 1-  הסיגנל נשלח לכל תהליך שה-owner שלו משותף לתהליך השולח.

 

ביצוע kill  עם יעד 0 – הסיגנל נשלח לכל התהליכים בקבוצת התהליכים של השולח.

 

ביצוע kill עם יעד שלילי n-, הסיגנל נשלח לכל תהליך בקבוצת התהליכים מספר n.