0Pricing
C Academy · درس

الإشارات

إشعارات غير متزامنة

الإشارات درس مجاني في C Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.

ما هي الإشارة

الإشارة هي إشعار غير متزامن يُرسل إلى عملية لإبلاغها بوقوع حدث، مثل ضغط المستخدم على Ctrl-C أو انتهاء عملية ابن. والإشارات شكل خفيف من IPC.

الإشارات الشائعة

من الإشارات التي ستصادفونها كثيرًا:

  • SIGINT مقاطعة (Ctrl-C)
  • SIGTERM طلب إنهاء مهذّب
  • SIGKILL إنهاء قسري (لا يمكن اعتراضه)
  • SIGCHLD تغيّرت حالة عملية ابن
  • SIGSEGV وصول غير صالح إلى الذاكرة

الإجراءات الافتراضية

لكل إشارة إجراء افتراضي: إنهاء، أو إنهاء مع تفريغ النواة، أو تجاهل، أو إيقاف، أو متابعة. ويمكنك تجاوز معظم هذه الإجراءات باستخدام معالج.

تثبيت معالج

الطريقة الحديثة والمحمولة لتعيين معالج هي sigaction. والمعالج عبارة عن دالة تستقبل رقم الإشارة.

#include <signal.h>
#include <stdio.h>

void on_signal(int sig) {
    /* note: printf is not async-signal-safe; for demo only */
    write(1, "caught\n", 7);
}

int install(void) {
    struct sigaction sa = {0};
    sa.sa_handler = on_signal;
    return sigaction(SIGINT, &sa, NULL);
}

لماذا لا نستخدم signal()

للدالة القديمة signal() سلوك غير متسق عبر الأنظمة، مثل إعادة تعيين المعالج وعدم التحكم في SA_RESTART. لذلك يُفضّل استخدام sigaction، فهي محددة السلوك وقابلة للنقل.

الدوال الآمنة مع الإشارات غير المتزامنة

يمكن للمعالج مقاطعة شفرتك في أي نقطة، لذا لا يجوز له استدعاء سوى الدوال الآمنة مع الإشارات غير المتزامنة مثل write. أما استدعاء printf أو malloc من داخل المعالج فقد يؤدي إلى تعارض دائم أو تلف.

استخدام علامة volatile

نمط آمن: يعيّن المعالج علامة من النوع volatile sig_atomic_t، ثم تتحقق منها الحلقة الرئيسية. يحافظ ذلك على صغر المعالج وأمانه.

#include <signal.h>

volatile sig_atomic_t stop = 0;

void handler(int sig) {
    stop = 1; /* only set a flag */
}
/* main loop: while (!stop) { do_work(); } */

إرسال الإشارات

استخدم kill(pid, sig) لإرسال إشارة إلى عملية أخرى، أو raise(sig) لإرسال إشارة إلى نفسك. وعلى الرغم من اسمها، ترسل kill أي إشارة، وليس الإشارات القاتلة فقط.

#include <signal.h>

int notify(int pid) {
    return kill(pid, SIGTERM); /* ask process to terminate */
}

حجب الإشارات

لحماية قسم حرج، احجب الإشارات مؤقتًا باستخدام sigprocmask ومجموعة إشارات. تظل الإشارات المحجوبة معلّقة، ويُسلَّمها النظام بمجرد إلغاء حجبها.

#include <signal.h>

void block_int(void) {
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    sigprocmask(SIG_BLOCK, &set, NULL);
}

جمع العمليات الابنة باستخدام SIGCHLD

عندما تنتهي عملية ابنة، ترسل النواة SIGCHLD. ويجمع معالج يستدعي waitpid العملية الابنة، مما يمنع بقاء عمليات زومبي في جدول العمليات.

#include <signal.h>
#include <sys/wait.h>

void reap(int sig) {
    while (waitpid(-1, NULL, WNOHANG) > 0)
        ; /* reap all finished children */
}

إشارات لا يمكن اعتراضها

هناك إشارتان حاسمتان: تنهي SIGKILL العملية دائمًا، وتوقف SIGSTOP العملية دائمًا. ولا يمكن اعتراضهما أو حجبهما أو تجاهلهما، مما يوفر للنظام طريقة مضمونة للتحكم في العمليات.

تحقق سريع

اختبر مدى فهمك للإشارات.

مراجعة

لقد تعلمت استخدام الإشارات للإشعارات غير المتزامنة.

  • ثبّت المعالجات باستخدام sigaction، وليس signal القديمة
  • يجب أن تكون المعالجات آمنة مع الإشارات غير المتزامنة؛ ويُفضّل تعيين علامة
  • أرسل الإشارات باستخدام kill/raise، واحجبها باستخدام sigprocmask
  • اجمع العمليات الابنة عند وصول SIGCHLD؛ ولا يمكن اعتراض SIGKILL وSIGSTOP

الأسئلة الشائعة

هل درس «الإشارات» مجاني؟

نعم — نص درس «الإشارات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.

ماذا ستتعلم في «الإشارات»؟

إشعارات غير متزامنة تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟

لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الإشارات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟

نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الأنابيب
  2. الذاكرة المشتركة
  3. قوائم انتظار الرسائل
  4. الإشارات
← العودة إلى C Academy