הרעיונות שב- 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 עם יעד 1-
הסיגנל נשלח לכל תהליך שה-owner שלו
משותף לתהליך השולח.
ביצוע kill עם יעד 0 – הסיגנל נשלח לכל התהליכים בקבוצת
התהליכים של השולח.
ביצוע kill עם יעד שלילי n-, הסיגנל נשלח לכל תהליך בקבוצת
התהליכים מספר n.