msgget(2)

الاسم
msgget - الحصول على معرف قائمة رسائل System V

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <sys/msg.h>

int msgget(key_t key, int msgflg);

الوصف
استدعاء النظام msgget() يُرجع معرف قائمة رسائل System V المرتبط بقيمة الوسيط key. يمكن استخدامه إما للحصول على معرف قائمة رسائل مُنشأة سابقًا (عندما يكون msgflg صفرًا و key لا يحمل القيمة IPC_PRIVATE)، أو لإنشاء مجموعة جديدة.

يتم إنشاء قائمة رسائل جديدة إذا كان key يحمل القيمة IPC_PRIVATE أو إذا لم يكن key هو IPC_PRIVATE، ولا توجد قائمة رسائل بالمفتاح key المحدد، وتم تحديد IPC_CREAT في msgflg.

إذا حدد msgflg كلاً من IPC_CREAT و IPC_EXCL وكانت قائمة رسائل موجودة بالفعل لـ key، فإن msgget() يفشل مع تعيين errno إلى EEXIST. (هذا مشابه لتأثير الدمج O_CREAT | O_EXCL لـ open(2).)

عند الإنشاء، تحدد البتات الأقل أهمية من الوسيط msgflg أذونات قائمة الرسائل. هذه البتات لها نفس التنسيق والدلالات مثل الأذونات المحددة للوسيط mode لـ open(2). (لا تُستخدم أذونات التنفيذ.)

إذا تم إنشاء قائمة رسائل جديدة، فسيتم تهيئة بنية البيانات المرتبطة بها msqid_ds (انظر msgctl(2)) كما يلي:

•   يتم تعيين msg_perm.cuid و msg_perm.uid إلى معرف المستخدم الفعّال للعملية المستدعية.

•   يتم تعيين msg_perm.cgid و msg_perm.gid إلى معرف المجموعة الفعّال للعملية المستدعية.

•   يتم تعيين أقل 9 بتات أهمية من msg_perm.mode إلى أقل 9 بتات أهمية من msgflg.

•   يتم تعيين msg_qnum و msg_lspid و msg_lrpid و msg_stime و msg_rtime إلى 0.

•   يتم تعيين msg_ctime إلى الوقت الحالي.

•   يتم تعيين msg_qbytes إلى حد النظام MSGMNB.

إذا كانت قائمة الرسائل موجودة بالفعل، يتم التحقق من الأذونات، ويتم إجراء فحص لمعرفة ما إذا كانت مُعلّمة للتدمير.

قيمة الإرجاع
عند النجاح، يُرجع msgget() معرف قائمة الرسائل (عدد صحيح غير سالب). عند الفشل، يتم إرجاع -1، ويتم تعيين errno للإشارة إلى الخطأ.

الأخطاء

EACCES
    توجد قائمة رسائل لـ key، لكن العملية المستدعية لا تملك الإذن للوصول إلى القائمة، ولا تملك القدرة CAP_IPC_OWNER في مساحة المستخدم التي تحكم مساحة IPC الخاصة بها.

EEXIST
    تم تحديد IPC_CREAT و IPC_EXCL في msgflg، لكن قائمة رسائل موجودة بالفعل لـ key.

ENOENT
    لا توجد قائمة رسائل لـ key ولم يحدد msgflg IPC_CREAT.

ENOMEM
    يجب إنشاء قائمة رسائل لكن النظام لا يملك ذاكرة كافية لبنية البيانات الجديدة.

ENOSPC
    يجب إنشاء قائمة رسائل لكن سيتم تجاوز حد النظام للعدد الأقصى لقوائم الرسائل (MSGMNI).

المعايير
POSIX.1-2024 XSI.

التاريخ
SVr4, SUSv1, POSIX.1-2001 XSI.

  لينكس
حتى Linux 2.3.20، كان Linux يُرجع EIDRM لـ msgget() على قائمة رسائل مُجدولة للحذف.

ملاحظات
IPC_PRIVATE ليس حقل علم بل هو نوع key_t. إذا تم استخدام هذه القيمة الخاصة لـ key، يتجاهل استدعاء النظام كل شيء باستثناء أقل 9 بتات أهمية من msgflg وينشئ قائمة رسائل جديدة (عند النجاح).

التالي هو حد نظام على موارد قائمة الرسائل يؤثر على استدعاء msgget():

MSGMNI
    حد على مستوى النظام لعدد قوائم الرسائل. قبل Linux 3.19، كانت القيمة المبدئية لهذا الحد تُحسب باستخدام صيغة تعتمد على ذاكرة النظام المتاحة. منذ Linux 3.19، القيمة المبدئية هي 32,000. على Linux، يمكن قراءة هذا الحد وتعديله عبر /proc/sys/kernel/msgmni.

العلل
ربما كان اختيار الاسم IPC_PRIVATE غير موفق، فاسم IPC_NEW كان سيظهر وظيفتها بشكل أوضح.

انظر أيضًا
msgctl(2), msgrcv(2), msgsnd(2), ftok(3), capabilities(7), mq_overview(7), sysvipc(7)

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

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

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