متوفر أيضًا بلغات أخرى: English · Español · Português · Français
أرقام إشارات لينكس
رقمُ كلّ إشارةٍ على خمس منصّات، والبحثُ العكسي لرقمٍ مجرَّد، وسببُ اختلاف الأرقام أصلًا.
ما أرقام الإشارات؟
الإشارةُ هي الطريقة التي يقاطع بها نظامُ يونكس عمليةً تعمل: ليطلب إليها التوقف، أو ليخبرها أنّ ابنًا لها انتهى، أو ليبلّغها أنها مسّت ذاكرةً ما كان لها أن تمسّها. ولكلٍّ منها اسمٌ مثل SIGTERM ورقمٌ صحيحٌ صغير، والأمر kill يرسل إحداها بأيٍّ منهما. والأسماءُ يثبّتها POSIX. أما الأرقام فلا.
وهنا تكمن الصعوبة كلُّها. فـPOSIX يوحّد أيَّ الإشارات موجودةٌ وما معناها، ويترك الترقيم لكلّ تطبيق — ولذلك فالجدول أدناه بخمسة أعمدة، عمودٍ لكلّ منصّة، وفيه صفوفٌ كثيرة تختلف فيها.
وتحمل هذه الصفحة الإشاراتِ الـ39 من دليل لينكس ومن ترويسة أبل، مع الرقم الذي تخصّصه كلُّ منصّة، وهل يوحّدها POSIX، وماذا يفعل السلوكُ الافتراضي إن لم تعالجها. وفوق الجدول أهمُّ أداةٍ فيه: اكتب رقمًا مجرَّدًا فتخبرك بما يعنيه في كلّ مكان.
كيف تستعملها
- ابدأ بالرقم إن كان هو ما بين يديك. اكتبه في البحث العكسي فتحصل على الإشارة التي يسمّيها في كلّ منصّة، وتنبيهٍ إن اختلفت. وهذا هو الاتجاه الذي يتركك فيه سطرُ سجلٍّ أو حالةُ خروج.
- ابحث بالاسم أو بالرقم أو بالوصف. SIGKILL وkill و9 وpipe كلُّها تعمل، والاسمُ المطابق يتصدّر بدل أن يُدفن تحت كلّ ما يحوي تلك الحروف فحسب.
- اقرأ الصفَّ كلَّه. السلوكُ الافتراضي يخبرك بما يحدث إن أهمل برنامجُك الإشارة، و«غير موجودة» تعني أنّ الإشارة ليست هناك أصلًا، وهذا غيرُ أن يكون لها رقمٌ آخر.
لماذا تختلف الأرقام، ولماذا ليس ذلك اعتباطًا
المثالُ الشهير هو SIGUSR1. فهو 10 على x86 وARM، و30 على Alpha وSPARC، و16 على MIPS وPA-RISC — ثلاثةُ أرقامٍ لاسمٍ واحد، وكلُّها لينكس. فالاختلافُ ليس بين أنظمة تشغيل، بل بين معماريّاتِ نظامٍ واحد.
وإذا قيل هكذا بدا مضايقةً. أما إذا قُلب فهو خطر: فالرقمُ نفسُه يعني إشاراتٍ مختلفة. فالعشرةُ هي SIGUSR1 على x86 وSIGBUS في كلّ ما عداها تقريبًا، فسكربتٌ أو شفرةٌ تثبّت العشرة باليد لا تفشل بصخبٍ حين تعمل حيث لم يُتوقَّع. بل ترسل خطأَ ناقلٍ إلى عمليةٍ كانت تنتظر إشارةَ مستخدم، فتموت العمليةُ على نحوٍ لم يكتب له أحدٌ معالِجًا.
والمطمئنُ أنّ للخلاف شكلًا. فمن الإشارات الـ31 التي يعرّفها دليلُ لينكس وترويسةُ أبل معًا، يوافق macOS عمودَ Alpha وSPARC في كلٍّ منها دون استثناء، ويوافق x86 في 19 فقط. فـmacOS وتلك المعماريّات تنحدر من BSD؛ أما لينكس على x86 فأخذ بترقيم System V. فثمّة هنا عائلتان في الحقيقة، وعمودٌ من جدول لينكس هو عمودُ BSD بلافتةٍ أخرى.
وحفنةٌ من الأرقام واحدةٌ في كلّ مكان، ولذلك هي التي يحفظها الناس: فالواحد دائمًا SIGHUP، والاثنان دائمًا SIGINT، والتسعة دائمًا SIGKILL، والخمسة عشر دائمًا SIGTERM. هذه الأربعة يمكن تثبيتها باليد دون خوف. وما عداها فلا يكاد.
حدودٌ صريحة
خمسُ منصّاتٍ ليست كلَّ المنصّات. فدليلُ لينكس يوثّق أربعَ مجموعاتٍ معمارية، وأبل توثّق macOS؛ أما سائرُ أنظمة BSD وSolaris وAIX وغيرها فلها ترويساتُها ولا تظهر هنا. ولأنّ مغزى الصفحة كلَّه أنّ الأرقام تتباين، فعامِل الغيابَ على أنه «غير معلوم» لا على أنه «موافقة» — فالخلاصةُ الآمنة من هذا الجدول هي استعمالُ الاسم دائمًا.
ثم إنّ الجدول يقف قبل إشارات الزمن الحقيقي. فهي تمتدّ من SIGRTMIN إلى SIGRTMAX، ولا أسماءَ فردية لها، وSIGRTMIN نفسُه ليس ثابتًا: إذ تحجز مكتبةُ C بعضَ الأرقام الدنيا لنفسها، فتتغيّر القيمةُ بين الأنظمة بل وبين إصدارات المكتبة. ورقمٌ من ذلك المدى لا يُبحث عنه في أيّ جدول، وهو صورةٌ أشدُّ من التحذير نفسِه.
وأرقامُ الإشارات ليست رموزَ خروج، وإن التقتا. فالصدفةُ تبلّغ عن عمليةٍ قتلتها الإشارةُ N بحالة خروجٍ قدرها 128 زائد N، فحالةُ 137 تعني الإشارة 9 على منصّةٍ تكون فيها 9 هي SIGKILL. وذلك الحسابُ عُرفُ الصدفة لا جزءٌ من الإشارة، وهو يرث المشكلةَ نفسَها في الحمل.
والبياناتُ مقروءةٌ من دليل signal(7) في لينكس ومن ترويسة xnu لدى أبل لا من جدولٍ آخر، وتاريخُ قراءتها مطبوعٌ تحت القائمة.
لماذا هي مجانية؟
لأن تشغيلها لا يكلّف شيئًا. فالجدولُ جزءٌ من الصفحة والبحثُ يجري في متصفحك؛ لا يُرفع شيءٌ ولا يرى أيُّ خادمٍ ما بحثتَ عنه.
والبرنامجُ الذي يقرأ المصدرين محفوظٌ إلى جانب البيانات التي ينتجها، والاختباراتُ تتحقق بالأسماء من الأرقام ومن قياس شجرة النسب، فالصفُّ الفاسد يكسر البناءَ بدل أن يبلغ الصفحة.