قوائم انتظار الرسائل
مراسلة منظّمة
قوائم انتظار الرسائل درس مجاني في C Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
الرسائل المنظّمة
يتيح طابور الرسائل للعمليات تبادل الرسائل المنفصلة بدلًا من دفق بايتات خام. وتحافظ النواة على حدود الرسائل، بحيث تصبح كل عملية إرسال عملية استقبال واحدة بالضبط.
الرسائل مقابل الدفقات
تسلّم القنوات دفقًا من البايتات تختلط فيه الحدود، بينما تسلّم طوابير الرسائل وحدات كاملة:
- كل عملية
sendهي رسالة واحدة - كل عملية
receiveتعيد رسالة واحدة - يمكن إعطاء الرسائل أولويات
طوابير POSIX مقابل System V
توجد واجهتان لبرمجة التطبيقات:
- POSIX:
mq_openوmq_sendوmq_receive، وتُسمّى بشرطة مائلة - System V:
msggetوmsgsndوmsgrcv، وتعتمد على المفاتيح وتستخدم رسائل ذات أنواع
يُعد POSIX الخيار الأحدث والأوضح.
فتح طابور
ينشئ mq_open طابورًا مُسمّى أو يفتحه، ويعيد واصفًا. ويمكنكم تمرير سمات مثل الحد الأقصى لعدد الرسائل وحجمها.
#include <mqueue.h>
#include <fcntl.h>
mqd_t open_queue(const char *name) {
return mq_open(name, O_CREAT | O_RDWR, 0644, NULL);
/* name like "/myqueue"; NULL uses default attributes */
}سمات الطابور
يحدّد struct mq_attr القيمة mq_maxmsg (السعة) والقيمة mq_msgsize (الحد الأقصى لعدد البايتات في الرسالة). ويجب أن يكون مخزن المستقبل المؤقت بحجم mq_msgsize على الأقل.
#include <mqueue.h>
void set_attr(struct mq_attr *a) {
a->mq_flags = 0;
a->mq_maxmsg = 10; /* up to 10 queued messages */
a->mq_msgsize = 256; /* each at most 256 bytes */
a->mq_curmsgs = 0;
}إرسال رسالة
يضع mq_send رسالة في الطابور مع تحديد أولوية لها. وتُسلّم الرسائل ذات الأولوية الأعلى أولًا.
#include <mqueue.h>
#include <string.h>
int post(mqd_t q, const char *text) {
return mq_send(q, text, strlen(text) + 1, 5); /* priority 5 */
}استقبال رسالة
يعيد mq_receive الرسالة ذات الأولوية الأعلى. ويجب أن يكون حجم المخزن المؤقت mq_msgsize على الأقل، وإلا يفشل الاستدعاء بالخطأ EMSGSIZE.
#include <mqueue.h>
#include <stdio.h>
void get(mqd_t q, size_t msgsize) {
char buf[256];
unsigned prio;
ssize_t n = mq_receive(q, buf, msgsize, &prio);
if (n >= 0) printf("got (prio %u): %s\n", prio, buf);
}ترتيب التسليم حسب الأولوية
بخلاف قناة FIFO، يسلّم طابور الرسائل الرسائل وفقًا لـ الأولوية أولًا، ثم وفق ترتيب الوصول داخل الأولوية نفسها. ويتيح ذلك للرسائل العاجلة تجاوز الرسائل الأخرى.
الحجب مقابل عدم الحجب
افتراضيًا، يحجب mq_send التنفيذ عندما يكون الطابور ممتلئًا، ويحجب mq_receive التنفيذ عندما يكون فارغًا. افتحوا الطابور باستخدام O_NONBLOCK لجعل هاتين العمليتين تعيدان EAGAIN بدلًا من الانتظار.
العمليات المحددة بمهلة
يقبل mq_timedsend وmq_timedreceive موعدًا نهائيًا مطلقًا، ويفشلان بالخطأ ETIMEDOUT إذا تعذّر إكمال العملية في الوقت المحدد. ويمنع ذلك الانتظار إلى الأبد.
التنظيف
أغلقوا الواصف باستخدام mq_close، وأزيلوا الطابور المُسمّى من النظام باستخدام mq_unlink حتى لا يبقى موجودًا بعد انتهاء جميع المستخدمين منه.
#include <mqueue.h>
void cleanup(mqd_t q, const char *name) {
mq_close(q);
mq_unlink(name); /* remove the named queue */
}تحقّق سريع
اختبر مدى فهمك لطوابير الرسائل.
مراجعة
تعلّمتم طوابير رسائل POSIX.
- تبادلوا رسائل منفصلة، لا بايتات خامًا
mq_openوmq_sendوmq_receive- يتم التسليم حسب الأولوية، ثم حسب ترتيب الوصول
- تتوفر اختيارات عدم الحجب والمهلة، مع تنظيف الموارد باستخدام mq_close وmq_unlink
الأسئلة الشائعة
هل درس «قوائم انتظار الرسائل» مجاني؟
نعم — نص درس «قوائم انتظار الرسائل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «قوائم انتظار الرسائل»؟
مراسلة منظّمة تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «قوائم انتظار الرسائل»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الأنابيب
- الذاكرة المشتركة
- قوائم انتظار الرسائل
- الإشارات