المتغيرات
فضاءات التسمية
أفعال

signal

من cppreference.com
< c‏ | program
معرفة في ملف <signal.h>
void (*signal( int sig, void (*handler) (int))) (int);

يحدد طريقة التعامل مع الإشارة ‎sig‎. طريقة التعامل (signal handler بالإنجليزية) تتراوح بين تنفيذ الرد الطبيعي أو التجاهل أو استدعاء دالة محددة من قبل المبرمج.


للبيئة الحق في الالغاء المؤقت لبعض الإشارات أو كلها أثناء تنفيذ الدالة الموكلة بالتعامل مع الإشارة. يجوز للبيئة كذلك الغاء الإشارة كاملة بعد حدوثها بتنفيذ signal(sig, SIG_DFL).

يجب ان تكون إحدى هذه:

محتويات

[تعديل] المعطيات

sig - الاشارة المراد تحديد طريقة التعامل معها. يجوز أن تكون قيمة خاصة بـالبيئة (نواة نظام التشغيل غالبا) أو احدى هذه القيم:
تحدد أنواع الإشارات
(ثابت ماكرو) [edit]


handler - طريقة التعامل مع الإشارة. يجب أن تكون إحدى هذه:
  • الماكرو SIG_DFL‎. الرد الطبيعي (في العادة اغلاق البرنامج).
  • الماكرو SIG_IGN‎. تجاهل الإشارة.
  • مؤشر إلى دالة. يجب أن يتوافق تعريف الدالة مع:
void fun(int sig);

[تعديل] القيمة المُرجعة

طريقة التعامل السابقة عند النجاح و SIG_ERR‎ عند الفشل. (بعض الأنظمة تمنع التعامل مع الإشارات).

[تعديل] الدالة الموكلة بالتعامل مع الإشارة

يجب تلتزم الدالة بالشروط الاتية لكي تصلح:

لو وصل سير البرنامج لنهاية الدالة عند التعامل مع SIGFPE‎ أو SIGILL‎ أو SIGSEGV‎ يكون السلوك غير معرف.

لو تم استدعاء الدالة نتيجة abort‎ أو raise‎ يكون سلوك البرنامج غير معرف لو قامت الدالة باستدعاء raise‎ كذلك.

إن لم تستدعى الدالة نتيجة abort‎ أو raise‎ (أي أنها قاطعت عمل البرنامج) يكون سلوك البرنامج غير معرف عند

  • استدعاء أي دالة من المكتبة الرئيسية باستثناء الدوال الآتية:
  • abort‎
  • _Exit‎
  • quick_exit‎
  • ‎signal‎ بشرط أن أول معطى هو نفس الإشارة الحالية (يجوز للدالة اعادة تسجيل نفسها فقط).
  • استعمال أي كائن static فيما عدا اسناد قيمته لvolatile std::sig_atomic_t.

عند بدء الدالة الموكلة بالتعامل مع الاشارة يكون وضع بيئة التعامل مع الفاصلة العائمة (floating-point environment) وقيم كل الكائنات غير محدد ما عدا:

  • الكائنات من نوع volatile sig_atomic_t

عند الرجوع من الدالة الموكلة بالإشارة, تصبح قيمة أي كائن تم تعديله من قبل الدالة غير معرفة باتسثناء الكائنات من نوع volatile sig_atomic_t.

عند استعمال signal في برنامج متعدد الخيوط (multithreaded) يكون السلوك غير معرف.

[تعديل] ملحوظات

تشترط POSIX كون ‎signal‎ صالحة للإستعمال بدخل الخيوط (thread-safe). يوجد قائمة بالدوال الصالحة للإستدعاء من داخل الدوال الموكلة بالإشارات هنا: [١].


بجانب ‎abort‎ و ‎raise‎, تحدد POSIX الدوال ‎kill‎ و ‎pthread_kill‎ و ‎sigqueue‎ التي يجوز استعمالها لتوليد الإشارات.

تنصح POSIX باستعمال sigaction بدلا من ‎signal‎, نظرا لضعف الاشتراطات المحددة من قبل معيار لغة السي والاختلافات الكبيرة بين الأنظمة.


يوجد نظام إشارات محدود جدا في ويندوز. ينصح باستخدام SEH لنفس أغراض ‎signal‎ على ويندوز.

[تعديل] مثال

#include <signal.h>
#include <stdio.h>
 
volatile sig_atomic_t gSignalStatus;
 
void signal_handler(int signal)
{
  gSignalStatus = signal;
}
 
int main(void)
{
  signal(SIGINT, signal_handler);
 
  printf("SignalValue: %d\n", gSignalStatus);
  printf("Sending signal: %d\n", SIGINT);
  raise(SIGINT);
  printf("SignalValue: %d\n", gSignalStatus);
}

الخرج:

SignalValue: 0
Sending signal: 2
SignalValue: 2

[تعديل] المراجع

  • معيار C99 ‏ (ISO/IEC 9899:1999):
  • 7.14.1.1 The signal function (p: 247-248)
  • معيار C89/C90 ‏(ISO/IEC 9899:1990):
  • 4.7.1.1 The signal function

[تعديل] انظر أيضا

runs the signal handler for particular signal
(دالة) [edit]