مکانیسم سیگنال دهی در هسته لینوکس به برنامه های در حال اجرا اجازه می دهد تا به صورت ناهمزمان سیستم را در صورت وقوع یک رویداد جدید مطلع کنند. به دلیل ماهیت آن، این مکانیسم سیگنالینگ به طور کلی به عنوان وقفه های نرم افزاری شناخته می شود. درست مانند وقفه های سخت افزاری، سیگنال ها جریان نرمال برنامه را قطع می کنند و زمانی که یک برنامه سیگنال دریافت می کند غیرقابل پیش بینی است.
مکانیسم سیگنال دهی در هسته لینوکس به برنامه های در حال اجرا اجازه می دهد تا به صورت ناهمزمان سیستم را در صورت وقوع یک رویداد جدید مطلع کنند. به دلیل ماهیت آن، این مکانیسم سیگنالینگ به طور کلی به عنوان وقفه های نرم افزاری شناخته می شود. درست مانند وقفه های سخت افزاری، سیگنال ها جریان نرمال برنامه را قطع می کنند و زمانی که یک برنامه سیگنال دریافت می کند غیرقابل پیش بینی است.
بیایید عمیقاً در مکانیزم سیگنال دهی در لینوکس غوطه ور شویم و بفهمیم که در پشت صحنه چه می گذرد.
مفاهیم اولیه سیگنال در لینوکس
در لینوکس، فرآیندها در سه وضعیت اساسی سیگنال تولید می کنند:
- هنگامی که یک موقعیت استثنایی در سمت سخت افزار رخ می دهد. به عنوان مثال، می توانید به رویدادهایی مانند تلاش برنامه برای دسترسی به منطقه ای خارج از فضای آدرس مجاز (عیب قطعه بندی) یا تولید کد ماشین که شامل عملیات تقسیم بر صفر است فکر کنید.
- موقعیت هایی مانند استفاده از کلیدهای ترکیبی مانند Ctrl + C یا Ctrl + Z در کنسول توسط کاربر، تغییر اندازه صفحه کنسول یا ارسال سیگنال کشتن.
- تایمر تنظیم شده در برنامه منقضی می شود، محدودیت CPU داده شده به برنامه بالا است، داده ها به یک توصیفگر فایل باز می آیند و غیره.
مفهوم سیگنال از نسخه های اولیه یونیکس وجود داشته است. پیش از این، چندین تفاوت بین نسخه های یونیکس در مورد پردازش سیگنال وجود داشت. بعداً با استانداردسازی POSIX برای مدیریت سیگنال، لینوکس و سایر مشتقات یونیکس از این استانداردها پیروی کردند. به همین دلیل، مفاهیم سیگنال های یونیکس و سیگنال های POSIX که ممکن است در برخی اسناد با آنها مواجه شوید، به تفاوت هایی اشاره دارد.
شماره های سیگنال
سیگنال ها مقادیر عددی مختلفی دارند که با یک شروع می شود. به عنوان مثال، سیگنال 1 تقریباً در هر سیستمی یک سیگنال HUP است یا سیگنال 9 یک سیگنال KILL است.
با این حال، هنگامی که از سیگنال ها در برنامه های خود استفاده می کنید، استفاده از این اعداد به شدت منع می شود. برای سیگنال های POSIX، فایل signal.h باید در برنامه باشد و توسعه دهنده باید به جای آن از تعاریف ثابت اعداد مرتبط مانند SIGHUP، SIGKILL و غیره استفاده کند.
اگر فایل /usr/include/signal.h را روی سیستم خود بررسی کنید، می توانید عملیات اضافی و سایر فایل های موجود را با مشاهده تعاریف مقادیری مانند __USE_POSIX، __USE_XOPEN، __USE_POSIX199309 و غیره در فایل مشاهده کنید. میتوانید شمارههای سیگنال موجود در سیستمهای لینوکس را در فایل /usr/include/asm-generic/signal.h بیابید، که نیازی نیست مستقیماً در کد برنامه خود وارد کنید.
تولید و ارسال سیگنال
تولید سیگنال به دلیل یک رویداد اتفاق می افتد. با این حال، ارسال (ارسال) سیگنال به برنامه مربوطه همزمان با تولید سیگنال اتفاق نمی افتد.
برای اینکه سیگنال به برنامه ارسال شود، برنامه باید در حال حاضر در حال اجرا باشد و دارای منابع CPU باشد. بنابراین، ارسال سیگنال به یک برنامه خاص زمانی اتفاق می افتد که برنامه مربوطه پس از سوئیچ زمینه دوباره شروع به کار کند.
مفهوم سیگنال معلق
در طول زمان از تولید تا انتقال سیگنال، سیگنال ها در حالت آماده به کار هستند. از فایل /proc/PID/status میتوانید به تعداد سیگنالهای معلق و تعداد سیگنالهای در انتظار مجاز برای یک فرآیند دسترسی داشته باشید.
# For a process with PID: 2299
cat /proc/2299/status
# Output
...
SigQ: 2/31630
...
ماسک های سیگنال و مسدود کردن
زمان دقیق رسیدن سیگنال ها اغلب توسط برنامه غیر قابل پیش بینی است. بنابراین، برخی از وقفه های بحرانی ممکن است در طول هر عملیات رخ دهد. این می تواند مشکلات بزرگی را برای یک برنامه در مقیاس بزرگ ایجاد کند.
برای جلوگیری از برخی شرایط نامطلوب مانند این، استفاده از ماسک های سیگنال ضروری است. بنابراین می توان برخی از سیگنال ها را قبل از یک عملیات بحرانی مسدود کرد. در این مرحله تکمیل قسمت بحرانی و حذف بلوک های تعریف شده مهم است. این فرآیند چیزی است که توسعه دهنده برنامه باید به آن توجه کند.
هنگامی که برنامه یک سیگنال را مسدود می کند، سیگنال های دیگر از همان نوع تولید شده در حالت انتظار خواهند بود تا زمانی که مسدود شوند. در برنامه، ارسال سیگنال های معلق نیز به محض حذف بلوک ارائه می شود.
به این ترتیب، همان نوع سیگنال هایی که در زمان بلوک در حالت انتظار قرار می گیرند، تنها یک بار پس از حذف بلوک در استفاده معمولی، به برنامه ارسال می شوند. وضعیت برای سیگنال های بلادرنگ متفاوت است.
انواع سیگنال لینوکس
اقدامات پیشفرض ممکن است بسته به نوع سیگنال متفاوت باشد. اگر برنامه ای که سیگنال مربوطه را دریافت می کند عملکرد کنترل کننده سیگنال نداشته باشد، عمل پیش فرض انجام می شود. گاهی اوقات این به معنای خاتمه برنامه و گاهی نادیده گرفتن سیگنال است.
برخی از سیگنال ها را نمی توان در لایه برنامه ضبط کرد، این سیگنال ها همیشه عملکرد پیش فرض را انجام می دهند (مانند سیگنال KILL).
علاوه بر برخی اقدامات که باعث خاتمه برنامه می شود، یک فایل دامپ اصلی نیز تولید می شود. فایلهای دامپ هسته که با نوشتن جدول حافظه مجازی فرآیند مربوطه روی دیسک ایجاد میشوند، به کاربر کمک میکنند تا اطلاعات وضعیت را قبل از پایان فرآیند با ابزارهای اشکالزدایی در مراحل بعدی بررسی کند.
مقادیر زیر بر اساس یک معماری نمونه MIPS است:
سیگنال
شماره
اقدام پیش فرض
آیا می توان آن را گرفت؟
SIGHUP
برنامه را خاتمه دهید
بله
SIGINT
برنامه را خاتمه دهید
بله
SIGQUIT
خاتمه برنامه (دامپ هسته)
بله
SIGILL
خاتمه برنامه (دامپ هسته)
بله
SIGTRAP
خاتمه برنامه (دامپ هسته)
بله
SIGABRT
خاتمه برنامه (دامپ هسته)
بله
SIGFPE
خاتمه برنامه (دامپ هسته)
بله
SIGKILL
برنامه را خاتمه دهید
خیر
SIGBUS
10
خاتمه برنامه (دامپ هسته)
بله
SIGSEGV
11
خاتمه برنامه (دامپ هسته)
بله
SIGSYS
12
خاتمه برنامه (دامپ هسته)
بله
SIGPIPE
13
برنامه را خاتمه دهید
بله
SIGALRM
14
برنامه را خاتمه دهید
بله
SIGTERM
15
برنامه را خاتمه دهید
بله
SIGUSR1
16
برنامه را خاتمه دهید
بله
SIGUSR2
17
برنامه را خاتمه دهید
بله
سیگچلد
18
نادیده گرفتن
بله
SIGTSTP
20
توقف کنید
بله
SIGURG
21
نادیده گرفتن
بله
SIGPOLL
22
برنامه را خاتمه دهید
بله
SIGSTOP
23
توقف کنید
خیر
SIGCONT
25
در صورت توقف ادامه دهید
بله
SIGTTIN
26
توقف کنید
بله
SIGTTOU
27
توقف کنید
بله
SIGVTALRM
28
برنامه را خاتمه دهید
بله
SIGPROF
29
برنامه را خاتمه دهید
بله
SIGXCPU
30
خاتمه برنامه (دامپ هسته)
بله
SIGXFSZ
31
خاتمه برنامه (دامپ هسته)
بله
چرخه حیات سیگنال ها در لینوکس
سیگنال ها از سه مرحله عبور می کنند. آنها عمدتاً در مرحله تولید، توسط هسته یا هر فرآیندی تولید می شوند و با یک عدد نشان داده می شوند. آنها به آرامی و به سرعت کار می کنند، زیرا هیچ بار اضافی بر روی آنها ندارند. اما اگر به سمت POSIX نگاه کنید، خواهید دید که سیگنال های بلادرنگ می توانند داده های اضافی را منتقل کنند.
مرحله تحویل سیگنال ها پس از مرحله تولید می آید. به طور معمول، سیگنال ها در سریع ترین زمان ممکن از هسته به برنامه می رسند. با این حال، گاهی اوقات برنامه ها می توانند سیگنال ها را در حین انجام عملیات حیاتی مسدود کنند. در چنین مواردی، سیگنال تا زمانی که تراکنش انجام شود، معلق می ماند.
مانند سیگنال ها، فرآیندها نیز بخشی جدایی ناپذیر از اکوسیستم لینوکس هستند. اگر قصد دارید مدیر سیستم لینوکس شوید، درک اینکه فرآیندها چیست و چگونه کار می کنند بسیار مهم است.