سیگنال و وضعیت پروسهها در لینوکس
در لینوکس برای ارسال یک رویداد یا اطلاع دادن یک رخداد به پروسهها میتوان از سیگنال استفاده نمود. شیوهی کار به این صورت است که پروسه در صورت دریافت سیگنال، اجرای کد اصلی خود را متوقف کرده و به سراغ پردازش Signal میرود. از همین روی در لینوکس به سیگنال Asynchronous Event و یا Soft Interrupt نیز گفته میشود.
تولید سیگنال و ارسال آن به یک پروسه میتواند از دل کرنل رخ داده، توسط یک پروسهی دیگر بوده، از طریق Terminal و به کمک دستور kill بوده و یا حتی با فشردن کلیدهایی مثل CTRL+Z یا CTRL+C توسط کاربر انجام شود.
پروسه با دریافت Signal در صورت وجود داشتن یک Handler درون کد برنامهی خود، به سراغ اجرای آن رفته و در غیر این صورت رفتار پیشفرضی که سیستمعامل برای هر سیگنال تعریف کرده است را اجرا میکند که در اکثر مواقع باعث Terminate شدن اجرای پروسه میشود. همچنین ذکر این نکته ضروری است که امکان تعریف کردن Handler برای دو سیگنال SIGKILL و SIGSTOP وجود نداشته و برای این دو همیشه رفتار تعریف شده توسط سیستمعامل اجرا میشود.
برخی از سیگنالها باعث تغییر در وضعیت اجرای پروسه میشوند. به عنوان مثال زدن CTRL+Z در اکثر برنامهها باعث میشود که برنامه در وضعیت Stopped قرار گرفته و به Background رود و یا زدن CTRL+C به پروسه یک Interrupt داده که ممکن است اجرای آنرا متوقف کند.
در پایان این نکته را اضافه کنم که ارسال SIGKILL با شماره ۹ برای برخی از برنامهها ممکن است باعث از بین رفتن داده شود. به عنوان مثال فرض کنید که یک برنامه فایلی را باز کرده و در حال نوشتن در آن است. اگر منتظر اتمام کار برنامه نمانده و وسط کار آن SIGKILL ارسال کنیم بلافاصله برنامه بسته شده و نوشتن در فایل تمام نشده و بخشی از داده از بین میرود ولی ارسال SIGTERM با شماره ۱۵ به برنامه در صورت Handle شدن آن توسط برنامه، این فرصت را به برنامه میدهد که نوشتن در فایل را به اتمام رسانده و سپس بسته شود.
در این ویدئو شیوهی کار سیگنال، تاثیر آن بر وضعیت پروسه و چرخهی اجرای پروسهها در لینوکس شرح داده شده و شیوهی تعریف Handler برای پردازش سیگنال در کد C نمایش داده میشود.
لینک ویدئو در یوتیوب:
https://youtu.be/6FbpnYDeWw0
لینک ویدئو در آپارات:
https://aparat.com/v/nruhez3
#ShortLinuxInternals #linux #internals #kernel #programming #signals #processes
Post #128
4.17K