mq_overview(7)

الاسم
mq_overview - نظرة عامة على قوائم انتظار الرسائل POSIX

الوصف
تسمح قوائم انتظار الرسائل POSIX للعمليات بتبادل البيانات في شكل رسائل. تختلف واجهة البرمجة هذه عن تلك المقدمة من قوائم انتظار رسائل System V (msgget(2)، msgsnd(2)، msgrcv(2)، إلخ)، ولكنها توفر وظائف مماثلة.

تُنشأ وتُفتح قوائم انتظار الرسائل باستخدام mq_open(3)؛ تُرجع هذه الدالة واصف قائمة انتظار رسائل (mqd_t)، يُستخدم للإشارة إلى قائمة انتظار الرسائل المفتوحة في الاستدعاءات اللاحقة. تُعرّف كل قائمة انتظار رسائل باسم بالصيغة /somename؛ أي سلسلة منتهية بقيمة خالية يصل طولها إلى NAME_MAX (أي 255) حرفًا تتكون من شرطة مائلة أولية، متبوعة بحرف واحد أو أكثر، لا تحتوي أي منها على شرطات مائلة. يمكن لعمليتين العمل على نفس قائمة الانتظار بتمرير نفس الاسم إلى mq_open(3).

تُنقل الرسائل إلى ومن قائمة انتظار باستخدام mq_send(3) و mq_receive(3). عندما تنتهي عملية من استخدام قائمة الانتظار، تُغلقها باستخدام mq_close(3)، وعندما لا تكون قائمة الانتظار مطلوبة بعد الآن، يمكن حذفها باستخدام mq_unlink(3). يمكن استرداد سمات قائمة الانتظار و(في بعض الحالات) تعديلها باستخدام mq_getattr(3) و mq_setattr(3). يمكن لعملية طلب إعلام غير متزامن بوصول رسالة إلى قائمة انتظار كانت فارغة سابقًا باستخدام mq_notify(3).

واصف قائمة انتظار الرسائل هو مرجع إلى وصف قائمة انتظار رسائل مفتوحة (انظر open(2)). بعد fork(2)، يرث الطفل نسخًا من واصفات قائمة انتظار الرسائل الخاصة بالأصل، وتشير هذه الواصفات إلى نفس أوصاف قائمة انتظار الرسائل المفتوحة مثل واصفات قائمة انتظار الرسائل المقابلة في الأصل. تشارك واصفات قائمة انتظار الرسائل المقابلة في العمليتين الأعلام (mq_flags) المرتبطة بوصف قائمة انتظار الرسائل المفتوحة.

لكل رسالة أولوية مرتبطة، وتُسلم الرسائل دائمًا إلى العملية المستقبلة ذات الأولوية الأعلى أولاً. تتراوح أولويات الرسائل من 0 (منخفض) إلى sysconf(_SC_MQ_PRIO_MAX) - 1 (مرتفع). على لينكس، تُرجع sysconf(_SC_MQ_PRIO_MAX) 32768، ولكن POSIX.1 يتطلب فقط أن يدعم التنفيذ أولويات على الأقل في النطاق 0 إلى 31؛ توفر بعض التطبيقات هذا النطاق فقط.

يصف باقي هذا القسم بعض التفاصيل المحددة لتنفيذ لينكس لقوائم انتظار الرسائل POSIX.

  واجهات المكتبة واستدعاءات النظام
في معظم الحالات، تُنفذ واجهات المكتبة mq_*() المذكورة أعلاه فوق استدعاءات النظام الأساسية التي تحمل نفس الاسم. يُشار إلى الانحرافات عن هذا المخطط في الجدول التالي:
    واجهة المكتبة | استدعاء النظام
    mq_close(3) | close(2)
    mq_getattr(3) | mq_getsetattr(2)
    mq_notify(3) | mq_notify(2)
    mq_open(3) | mq_open(2)
    mq_receive(3) | mq_timedreceive(2)
    mq_send(3) | mq_timedsend(2)
    mq_setattr(3) | mq_getsetattr(2)
    mq_timedreceive(3) | mq_timedreceive(2)
    mq_timedsend(3) | mq_timedsend(2)
    mq_unlink(3) | mq_unlink(2)

  الإصدارات
قوائم انتظار الرسائل POSIX مدعومة منذ لينكس 2.6.6. دعم glibc متاح منذ glibc 2.3.4.

  تهيئة النواة
دعم قوائم انتظار الرسائل POSIX قابل للتهيئة عبر خيار تهيئة النواة CONFIG_POSIX_MQUEUE. هذا الخيار مفعل مبدئيًا.

  الاستمرارية
قوائم انتظار الرسائل POSIX لها استمرارية نواة: إذا لم تُحذف بواسطة mq_unlink(3)، ستظل قائمة انتظار الرسائل موجودة حتى إيقاف تشغيل النظام.

  الربط
يجب ترجمة البرامج التي تستخدم واجهة برمجة تطبيقات قائمة انتظار الرسائل POSIX باستخدام cc -lrt للربط مع مكتبة الوقت الفعلي، librt.

  واجهات /proc
يمكن استخدام الواجهات التالية لتحديد كمية ذاكرة النواة التي تستهلكها قوائم انتظار الرسائل POSIX ولتعيين السمات المبدئية لقوائم انتظار الرسائل الجديدة:

/proc/sys/fs/mqueue/msg_default (منذ لينكس 3.5)
    يُعرّف هذا الملف القيمة المستخدمة لإعداد mq_maxmsg لقائمة انتظار جديدة عند إنشاء قائمة الانتظار باستدعاء mq_open(3) حيث يُحدد attr كـ NULL. القيمة المبدئية لهذا الملف هي 10. الحد الأدنى والأقصى هما كما في /proc/sys/fs/mqueue/msg_max. ستكون القيمة المبدئية mq_maxmsg لقائمة انتظار جديدة هي الأصغر بين msg_default و msg_max. قبل لينكس 2.6.28، كانت القيمة المبدئية mq_maxmsg هي 10؛ من لينكس 2.6.28 إلى لينكس 3.4، كانت القيمة المبدئية هي القيمة المحددة للحد msg_max.

/proc/sys/fs/mqueue/msg_max
    يمكن استخدام هذا الملف لعرض وتغيير قيمة السقف للحد الأقصى لعدد الرسائل في قائمة انتظار. تعمل هذه القيمة كسقف للوسيطة attr->mq_maxmsg المعطاة لـ mq_open(3). القيمة المبدئية لـ msg_max هي 10. الحد الأدنى هو 1 (10 قبل لينكس 2.6.28). الحد الأعلى هو HARD_MSGMAX. يُتجاهل حد msg_max للعمليات المميزة (CAP_SYS_RESOURCE)، ولكن مع ذلك يُفرض سقف HARD_MSGMAX.

    تغير تعريف HARD_MSGMAX عبر إصدارات النواة:

    •   حتى لينكس 2.6.32: 131072 / sizeof(void *)

    •   لينكس 2.6.33 إلى لينكس 3.4: (32768 * sizeof(void *) / 4)

    •   منذ لينكس 3.5: 65,536

/proc/sys/fs/mqueue/msgsize_default (منذ لينكس 3.5)
    يُعرّف هذا الملف القيمة المُستخدمة لإعداد mq_msgsize لقائمة انتظار جديدة عند إنشاء القائمة باستدعاء mq_open(3) حيث يُحدد attr كـ NULL. القيمة المبدئية لهذا الملف هي 8192 (بايت). الحد الأدنى والأقصى كما في /proc/sys/fs/mqueue/msgsize_max. إذا تجاوز msgsize_default قيمة msgsize_max، فتُحد القيمة المبدئية mq_msgsize لقائمة الانتظار الجديدة إلى حد msgsize_max. قبل لينكس 2.6.28، كانت القيمة المبدئية mq_msgsize هي 8192؛ ومن لينكس 2.6.28 إلى لينكس 3.4، كانت القيمة المبدئية هي القيمة المُحددة لحد msgsize_max.

/proc/sys/fs/mqueue/msgsize_max
    يُستخدم هذا الملف لعرض وتغيير الحد الأعلى لأقصى حجم للرسالة. تعمل هذه القيمة كحد أعلى للوسيطة attr->mq_msgsize المُعطاة لـ mq_open(3). القيمة المبدئية لـ msgsize_max هي 8192 بايت. القيمة الدنيا هي 128 (8192 قبل لينكس 2.6.28). اختلف الحد الأعلى لـ msgsize_max عبر إصدارات النواة:

    •   قبل لينكس 2.6.28، الحد الأعلى هو INT_MAX.

    •   من لينكس 2.6.28 إلى لينكس 3.4، الحد هو 1,048,576.

    •   منذ لينكس 3.5، الحد هو 16,777,216 (HARD_MSGSIZEMAX).

    يُتجاهل حد msgsize_max للعمليات المميزة (CAP_SYS_RESOURCE)، ولكن منذ لينكس 3.5، يُفرض الحد الأعلى HARD_MSGSIZEMAX للعمليات المميزة.

/proc/sys/fs/mqueue/queues_max
    يُستخدم هذا الملف لعرض وتغيير الحد على مستوى النظام لعدد قوائم انتظار الرسائل التي يُمكن إنشاؤها. القيمة المبدئية لـ queues_max هي 256. لا يُفرض حد أعلى على حد queues_max؛ يُمكن للعمليات المميزة (CAP_SYS_RESOURCE) تجاوز الحد (لكن انظر BUGS).

  حد المورد
يُوصف حد المورد RLIMIT_MSGQUEUE، الذي يضع حدًا على مقدار المساحة التي يُمكن أن تستهلكها جميع قوائم انتظار الرسائل التابعة لمعرف المستخدم الحقيقي لعملية ما، في getrlimit(2).

  وصل نظام ملفات قائمة انتظار الرسائل
في لينكس، تُنشأ قوائم انتظار الرسائل في نظام ملفات افتراضي. (قد تُوفر التطبيقات الأخرى أيضًا هذه الميزة، لكن التفاصيل قد تختلف.) يُمكن وصل نظام الملفات هذا (بواسطة المستخدم الفائق) باستخدام الأوامر التالية:

    # mkdir /dev/mqueue
    # mount -t mqueue none /dev/mqueue

يُفعّل البت اللاصق آليًا على دليل الوصل.

بعد وصل نظام الملفات، يُمكن عرض قوائم انتظار الرسائل على النظام والتعامل معها باستخدام الأوامر المُستخدمة عادةً للملفات (مثل ls(1) و rm(1)).

تتكون محتويات كل ملف في الدليل من سطر واحد يحتوي على معلومات حول القائمة:

    $ cat /dev/mqueue/mymq
    QSIZE:129     NOTIFY:2    SIGNO:0    NOTIFY_PID:8260

هذه الحقول كما يلي:

QSIZE
    عدد بايتات البيانات في جميع الرسائل في القائمة (لكن انظر BUGS).

NOTIFY_PID
    إذا كانت هذه القيمة غير صفرية، فقد استخدمت العملية بهذا PID mq_notify(3) للتسجيل للإشعار غير المتزامن بالرسائل، وتصف الحقول المتبقية كيفية حدوث الإشعار.

NOTIFY
    طريقة الإشعار: 0 هي SIGEV_SIGNAL؛ 1 هي SIGEV_NONE؛ و 2 هي SIGEV_THREAD.

SIGNO
    رقم الإشارة المُستخدم لـ SIGEV_SIGNAL.

  تطبيق لينكس لواصفات قائمة انتظار الرسائل
في لينكس، واصف قائمة الرسائل هو في الواقع واصف ملف. (لا يتطلب POSIX مثل هذا التنفيذ.) هذا يعني أنه يمكن مراقبة واصف قائمة الرسائل باستخدام select(2) أو poll(2) أو epoll(7). هذا غير محمول.

علامة الإغلاق عند التنفيذ (انظر open(2)) تُضبط آليًا على واصف الملف الذي يُرجعه mq_open(2).

  مساحات أسماء IPC
لمناقشة تفاعل كائنات قائمة رسائل POSIX ومساحات أسماء IPC، انظر ipc_namespaces(7).

ملاحظات
قوائم رسائل System V (msgget(2) و msgsnd(2) و msgrcv(2) وغيرها) هي واجهة برمجة تطبيقات أقدم لتبادل الرسائل بين العمليات. توفر قوائم رسائل POSIX واجهة مصممة بشكل أفضل من قوائم رسائل System V؛ من ناحية أخرى، قوائم رسائل POSIX أقل توفرًا على نطاق واسع (خاصة على الأنظمة الأقدم) من قوائم رسائل System V.

لا يدعم لينكس حاليًا (لينكس 2.6.26) استخدام قوائم التحكم في الوصول (ACLs) لقوائم رسائل POSIX.

العلل
من لينكس 3.5 إلى لينكس 3.14، فرضت النواة سقفًا قدره 1024 (HARD_QUEUESMAX) على القيمة التي يمكن رفع حد queues_max إليها، وطُبق السقف حتى للعمليات المميزة. أُزيلت قيمة السقف هذه في لينكس 3.14، وأزالت التصحيحات للينكس المستقر 3.5.x إلى 3.13.x السقف أيضًا.

كما نُفذ (ووُثّق) أصلاً، عرض حقل QSIZE العدد الإجمالي للبايتات (التي يوفرها المستخدم) في جميع الرسائل في قائمة الرسائل. غيرت بعض التغييرات في لينكس 3.5 السلوك عن غير قصد، بحيث تضمن هذا الحقل أيضًا عدد بايتات النفقات العامة للنواة المستخدمة لتخزين الرسائل في القائمة. صُحح هذا التراجع السلوكي في لينكس 4.2 (وسلسلة النواة المستقرة السابقة)، بحيث تضمن العدد مرة أخرى فقط بايتات بيانات المستخدم في الرسائل في القائمة.

أمثلة
مثال على استخدام وظائف قائمة الرسائل المختلفة موضح في mq_notify(3).

انظر أيضًا
getrlimit(2)، mq_getsetattr(2)، poll(2)، select(2)، mq_close(3)، mq_getattr(3)، mq_notify(3)، mq_open(3)، mq_receive(3)، mq_send(3)، mq_unlink(3)، epoll(7)، namespaces(7)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.