سیگنالهای یونیکس
سیگنالها (به انگلیسی: signal) وقفههایی هستند که توسط نرمافزارها ایجاد میشوند و آنها بعد از اینکه رویداد خاصی اتفاق افتاد، به یک فرایند ارسال میشوند. یک سیگنال یک نوع آگاهسازی ناهمزمان است که به یک فرایند ارسال میشود تا آن فرایند را از روی دادن اتفاقی آگاه کند. وقتی که یک وقفه سختافزاری مانند اجرای یک دستورالعمل غیر مجاز رخ میدهد، هسته سیستمعامل هم میتواند مستقیماً سیگنالی به برنامه ارسال کند. همچنین یک کاربر هم میتواند با فشردن کلیدهایی از صفحه کلید تعدادی سیگنال به برنامه ارسال کند. برنامهای که سیگنال دریافت کرده، باید به آن سیگنال پاسخ داده و عکسالعمل نشان دهد. برنامه میتواند برخی از سیگنالها را نادیده بگیرد اما برخی از سیگنالها حتماً باید پاسخ داده شوند. هر سیگنال یک رفتار پیشفرض دارد. در صورتی که برنامه هیچ عکسالعملی به سیگنال دریافت شده نشان ندهد، این رفتار پیشفرض اعمال میشود. رفتار پیشفرض میتواند یکی از موارد زیر باشد:
- سیگنال بعد از اینکه دریافت شد، دور انداخته شود.
- پس از دریافت سیگنال، فرایند دریافتکننده خاتمه یابد.
- یک core file ایجاد شده و سپس برنامه خاتمه یابد.
- برنامه پس از دریافت سیگنال متوقف شود.
سیگنالها را میتوان به چند دسته مختلف تقسیمبندی کرد:
- سختافزاری
- نرمافزاری
- آگاهسازی از وضعیت ورودی/خروجی
- کنترل فرایند
- کنترل منابع
مدیریت سیگنالها
توسط kill() میتوان سیگنالی را به یک فرایند ارسال کرد. سیگنالها را میتوان توسط فراخوان سیستمی sigaction() یا signal() مدیریت کرد. این فراخوانها در فایل سرآیند signal.h (فایل csignal در سی++) تعریف شدهاند. نحوه اعلان kill() بدین شکل است:
int kill(pid_t pid, int sig);
این فراخوان سیگنال sig را به فرایندی که توسط pid مشخص شده ارسال میکند. اگر مقدار pid عدد -1 باشد، سیگنال مورد نظر به همه فرایندها ارسال خواهد شد. اگر سیگنال با موفقیت ارسال شد مقدار 0 و در غیر این صورت مقدار -1 برگرشت داده میشود.
همچنین فراخوان signal() هم بدین شکل اعلان شدهاست:
void (*signal(int sig, void (*func)(int)))(int);
در بعضی از پیادهسازیها از typedefها برای سادگی در خواندن استفاده شدهاست:
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t func);
این فراخوان تعیین میکند که برنامه باید چه عکسالعملی را در قبال یک سیگنال نشان دهد. برنامهها میتوانند از این فراخوان برای اجرای یک تابع خاص در هنگام دریافت یک سیگنال استفاده کنند. در اعلان بالا، به محض اینکه سیگنال sig دریافت شد، تابع func اجرا میشود. این تابع در حقیقت همان عکسالعمل برنامه در قبال سیگنال را انجام میدهد. در صورت موفقیت، اشارهگری به تابع func برگشت داده میشود و در صورت شکست مقدار -1 برمیگردد. همچنین میتوان پارامتر دوم را با ماکرو SIG_IGN مقدار دهی کرد تا سیگنال نادیده گرفته شود. البته همه سیگنالها را نمیتوان نادیده گرفت. اگر پارامتر دوم با DIG_DFL مقدار دهی شده باشد، رفتار پیشفرض در قبال سیگنال اعمال خواهد شد.
منابع
- ↑ "IPC:Interrupts and Signals:". Cs.cf.ac.uk. Retrieved 2014-05-22.
- ↑ "kill". Pubs.opengroup.org. Retrieved 2014-05-22.
- ↑ "sigaction". Pubs.opengroup.org. Retrieved 2014-05-22.
- ↑ "signal". Pubs.opengroup.org. Retrieved 2014-05-22.