سیگنال‌ها در سیستم‌های Unix/Linux

آیا می‌دانید سیگنال چیست؟

سیگنال‌ها وقفه‌های نرم‌افزاری هستند که به یک برنامه ارسال می‌شوند تا نشان دهند اتفاق مهمی رخ داده است. این رویدادها می‌توانند از درخواست‌های کاربر گرفته تا خطاهای دسترسی غیرمجاز به حافظه، متفاوت باشند. برخی سیگنال‌ها، مانند سیگنال SIGINT، نشان‌دهنده این است که کاربر از برنامه خواسته تا کاری را انجام دهد که در جریان معمول برنامه قرار ندارد.

سیگنال‌ها مکانیزمی برای پیام‌های آسنکرون یک‌طرفه هستند. ممکن است یک سیگنال از کرنل به یک پراسس، از یک پراسس به یک پراسس دیگر یا از یک پراسس به خودش فرستاده شود. سیگنال‌ها به طور معمول نسبت به برخی از رویدادها به یک پراسس هشدار می‌دهند، از جمله خطای دسترسی به قسمت غیرمجاز حافظه یا وقتی که کاربر کلیدهای Ctr+C را فشار می‌دهد.

کرنل لینوکس حدود 30 سیگنال را پیاده‌سازی کرده است. هر سیگنال توسط یک عدد از 1 تا 30 مشخص می‌شود. نام سیگنال‌ها هیچ استدلالی ندارد و اغلب توضیحی هستند. به عنوان مثال SIGKILL یا سیگنال شماره 9 به برنامه می‌گوید که کسی سعی دارد آن را بکشد.

کنترل عملیات سیگنال چگونه است؟

پراسس‌ها می‌توانند کنترل کنند که هنگام دریافت سیگنال‌ها چه عملیاتی انجام شود، به استثنای سیگنال‌های SIGKILL و SIGSTOP که همیشه پراسس را متوقف می‌کنند.

کنترل عملیات سیگنال به سه شکل می‌تواند انجام شود:

1. عمل پیش‌فرض انتخاب شود

هر سیگنال عملیات پیش‌فرض به خود را دارد که ممکن است خاتمه دادن به روند اجرای پراسس باشد.

2. سیگنال نادیده گرفته شود

در این‌صورت رخداد سیگنال هیچ‌گونه تاثیری بر عملکرد برنامه نخواهد داشت (رخداد سیگنال ساکت خواهد بود).

3. سیگنال کنترل‌شده و عملیات خاصی انجام شود

پراسس به محض دریافت سیگنال به این عملکرد پرش می‌کند و بعد از اتمام، اجرای پراسس به مکان پرش منتقل می‌شود.

نکته: از واژه raise برای نشان دادن تولید سیگنال و از واژه catch برای نشان دادن دریافت سیگنال استفاده می‌شود.

انواع سیگنال را بشناسیم

در جدول زیر انواع سیگنال‌ها به همراه نام و شماره آن‌ها ذکر شده است.

ارسال سیگنال چگونه است؟

سیگنال‌ها در شرایط خطا توسط Shell و Terminal Handler ایجاد می‌شوند تا باعث ایجاد وقفه شوند و همچنین می‌توانند از یک فرآیند به فرآیند دیگر ارسال شوند تا اطلاعات را منتقل یا باعث اصلاح رفتار شوند.

دستور kill برای ارسال سیگنال به پراسس‌ها استفاده می‌شود. این نام‌گذاری از این جهت است که رفتار اکثر سیگنال‌ها خاتمه برنامه است.

Kill –(SignalID or SignalName) –(ProcessID)

با این دستور می‌توانیم هر سیگنالی را به هر پراسسی ارسال کنیم.


سیگنال و PVM

هسته سامانه PVM با زبان ++C و در محیط لینوکس توسعه یافته است. مدیریت سیگنال‌ها در برنامه‌نویسی بر پایه سیستم‌عامل لینوکس از چالش‌های جذاب و مهم محسوب می‌شود.

اصولا برنامه‌های بزرگ نیاز به آگاهی کامل و مدیریت درست سیگنال‌ها به جهت عملکرد دقیق و انطباق کامل با استانداردهای توسعه در لینوکس دارند که PVM نیز از این قاعده مستثنی نیست.