.\" -*- coding: UTF-8 -*- .\" Copyright 1993, Giorgio Ciucci .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MSGOP 2 "11 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم msgrcv, msgsnd \- عمليات طابور رسائل System V .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBssize_t msgrcv(\fPsize_t msgsz; \fB int \fP\fImsqid\fP\fB, void \fP\fImsgp\fP\fB[\fP\fImsgsz\fP\fB], size_t \fP\fImsgsz\fP\fB, long \fP\fImsgtyp\fP\fB,\fP \fB int \fP\fImsgflg\fP\fB);\fP .P \fBint msgsnd(\fPsize_t msgsz; \fB int \fP\fImsqid\fP\fB, const void \fP\fImsgp\fP\fB[\fP\fImsgsz\fP\fB], size_t \fP\fImsgsz\fP\fB,\fP \fB int \fP\fImsgflg\fP\fB);\fP .fi .SH الوصف استدعاءات النظام \fBmsgsnd\fP() و \fBmsgrcv\fP() تُستخدم لإرسال الرسائل إلى طابور رسائل System\ V واستقبالها منه. يجب أن تمتلك العملية المستدعية صلاحية الكتابة على طابور الرسائل لإرسال رسالة، وصلاحية القراءة لاستقبال رسالة. .P الوسيط \fImsgp\fP هو مؤشر إلى بنية معرفة من قبل المستدعي بالشكل العام التالي: .P .in +4n .EX struct msgbuf { long mtype; /* نوع الرسالة، يجب أن يكون > 0 */ char mtext[1]; /* بيانات الرسالة */ }; .EE .in .P الحقل \fImtext\fP هو مصفوفة (أو بنية أخرى) يُحدد حجمها بواسطة \fImsgsz\fP، وهي قيمة عددية غير سالبة. يُسمح برسائل ذات طول صفري (أي لا يوجد حقل \fImtext\fP). يجب أن يحتوي الحقل \fImtype\fP على قيمة عددية موجبة تمامًا. يمكن استخدام هذه القيمة من قبل العملية المستقبلة لاختيار الرسالة (انظر وصف \fBmsgrcv\fP() أدناه). .SS msgsnd() استدعاء النظام \fBmsgsnd\fP() يُلحق نسخة من الرسالة المشار إليها بواسطة \fImsgp\fP إلى طابور الرسائل الذي يُحدد معرفه بواسطة \fImsqid\fP. .P إذا توفرت مساحة كافية في الطابور، ينجح \fBmsgsnd\fP() فورًا. سعة الطابور تُحكم بواسطة الحقل \fImsg_qbytes\fP في بنية البيانات المرتبطة بطابور الرسائل. أثناء إنشاء الطابور، يُهيأ هذا الحقل إلى \fBMSGMNB\fP بايت، لكن يمكن تعديل هذا الحد باستخدام \fBmsgctl\fP(2). يُعتبر طابور الرسائل ممتلئًا إذا تحقق أحد الشرطين التاليين: .IP \[bu] 3 إضافة رسالة جديدة إلى الطابور ستؤدي إلى تجاوز العدد الإجمالي للبايتات في الطابور للحجم الأقصى للطابور (الحقل \fImsg_qbytes\fP). .IP \[bu] إضافة رسالة أخرى إلى الطابور ستؤدي إلى تجاوز العدد الإجمالي للرسائل في الطابور للحجم الأقصى للطابور (الحقل \fImsg_qbytes\fP). هذا الفحص ضروري لمنع وضع عدد غير محدود من الرسائل ذات الطول الصفري في الطابور. على الرغم من أن هذه الرسائل لا تحتوي على بيانات، إلا أنها تستهلك ذاكرة نواة (مقفلة). .P إذا لم تتوفر مساحة كافية في الطابور، فإن السلوك المبدئي لـ \fBmsgsnd\fP() هو الحظر حتى تتوفر مساحة. إذا تم تحديد \fBIPC_NOWAIT\fP في \fImsgflg\fP، فإن الاستدعاء يفشل بدلاً من ذلك مع الخطأ \fBEAGAIN\fP. .P قد يفشل استدعاء \fBmsgsnd\fP() المحظور أيضًا إذا: .IP \[bu] 3 تمت إزالة الطابور، وفي هذه الحالة يفشل استدعاء النظام مع تعيين \fIerrno\fP إلى \fBEIDRM\fP؛ أو .IP \[bu] تم التقاط إشارة، وفي هذه الحالة يفشل استدعاء النظام مع تعيين \fIerrno\fP إلى \fBEINTR\fP؛ انظر \fBsignal\fP(7). (لا يُعاد تشغيل \fBmsgsnd\fP() آليًا بعد مقاطعته بواسطة معالج إشارة، بغض النظر عن إعداد العلم \fBSA_RESTART\fP عند إنشاء معالج الإشارة.) .P عند الإكمال بنجاح، تُحدث بنية بيانات طابور الرسائل كما يلي: .IP \[bu] 3 \fImsg_lspid\fP يُضبط إلى معرف العملية للعملية المستدعية. .IP \[bu] \fImsg_qnum\fP يُزاد بمقدار 1. .IP \[bu] \fImsg_stime\fP يُضبط إلى الوقت الحالي. .SS msgrcv() استدعاء النظام \fBmsgrcv\fP() يزيل رسالة من الطابور المحدد بواسطة \fImsqid\fP ويضعها في المخزن المؤقت المشار إليه بواسطة \fImsgp\fP. .P الوسيط \fImsgsz\fP يُحدد الحجم الأقصى بالبايتات للعضو \fImtext\fP من البنية المشار إليها بواسطة الوسيط \fImsgp\fP. إذا كان طول نص الرسالة أكبر من \fImsgsz\fP، فإن السلوك يعتمد على ما إذا كان \fBMSG_NOERROR\fP محددًا في \fImsgflg\fP. إذا تم تحديد \fBMSG_NOERROR\fP، فسيُقتطع نص الرسالة (وسيُفقد الجزء المقتطع)؛ إذا لم يُحدد \fBMSG_NOERROR\fP، فلن تُزال الرسالة من الطابور ويفشل استدعاء النظام بإرجاع \-1 مع تعيين \fIerrno\fP إلى \fBE2BIG\fP. .P ما لم يُحدد \fBMSG_COPY\fP في \fImsgflg\fP (انظر أدناه)، فإن الوسيط \fImsgtyp\fP يُحدد نوع الرسالة المطلوبة، كما يلي: .IP \[bu] 3 إذا كان \fImsgtyp\fP يساوي 0، فتُقرأ أول رسالة في الطابور. .IP \[bu] إذا كان \fImsgtyp\fP أكبر من 0، فتُقرأ أول رسالة في الطابور من النوع \fImsgtyp\fP، ما لم يُحدد \fBMSG_EXCEPT\fP في \fImsgflg\fP، وفي هذه الحالة تُقرأ أول رسالة في الطابور من نوع لا يساوي \fImsgtyp\fP. .IP \[bu] إذا كان \fImsgtyp\fP أقل من 0، فتُقرأ أول رسالة في الطابور ذات النوع الأدنى الأصغر من أو المساوي للقيمة المطلقة لـ \fImsgtyp\fP. .P الوسيط \fImsgflg\fP هو قناع بتات يُبنى بواسطة OR معًا صفرًا أو أكثر من الأعلام التالية: .TP \fBIPC_NOWAIT\fP أرجع فورًا إذا لم تكن هناك رسالة من النوع المطلوب في الطابور. يفشل استدعاء النظام مع تعيين \fIerrno\fP إلى \fBENOMSG\fP. .TP \fBMSG_COPY\fP (منذ لينكس 3.8) .\" commit 4a674f34ba04a002244edaf891b5da7fc1473ae8 اجلب نسخة غير مدمرة من الرسالة في الموضع الترتيبي في الطابور المحدد بواسطة \fImsgtyp\fP (تُعتبر الرسائل مرقمة بدءًا من 0). .IP يجب تحديد هذه العلامة بالتزامن مع \fBIPC_NOWAIT\fP، مما يؤدي إلى أنه إذا لم تكن هناك رسالة متاحة في الموضع المحدد، يفشل الاستدعاء فورًا مع الخطأ \fBENOMSG\fP. نظرًا لأنهما يغيران معنى \fImsgtyp\fP بطرق متعامدة، لا يمكن تحديد كل من \fBMSG_COPY\fP و\fBMSG_EXCEPT\fP في \fImsgflg\fP. .IP أُضيفت العلامة \fBMSG_COPY\fP لتنفيذ مرفق استعادة نقطة التفتيش للنواة وهي متاحة فقط إذا بُنيت النواة مع الخيار \fBCONFIG_CHECKPOINT_RESTORE\fP. .TP \fBMSG_EXCEPT\fP تُستخدم مع \fImsgtyp\fP أكبر من 0 لقراءة أول رسالة في الطابور بنوع رسالة يختلف عن \fImsgtyp\fP. .TP \fBMSG_NOERROR\fP لاقتطاع نص الرسالة إذا كان أطول من \fImsgsz\fP بايت. .P إذا لم تكن هناك رسالة من النوع المطلوب متاحة ولم يُحدد \fBIPC_NOWAIT\fP في \fImsgflg\fP، فتُحجب العملية المستدعية حتى يحدث أحد الشروط التالية: .IP \[bu] 3 تُوضع رسالة من النوع المطلوب في الطابور. .IP \[bu] تُزال طابور الرسائل من النظام. في هذه الحالة، يفشل استدعاء النظام مع تعيين \fIerrno\fP إلى \fBEIDRM\fP. .IP \[bu] تلتقط العملية المستدعية إشارة. في هذه الحالة، يفشل استدعاء النظام مع تعيين \fIerrno\fP إلى \fBEINTR\fP. (لا يُعاد تشغيل \fBmsgrcv\fP() آليًا بعد مقاطعته بواسطة معالج إشارة، بغض النظر عن إعداد العلامة \fBSA_RESTART\fP عند إنشاء معالج إشارة.) .P عند الإكمال بنجاح، تُحدث بنية بيانات طابور الرسائل كما يلي: .IP يُعيّن \fImsg_lrpid\fP إلى معرف العملية للعملية المستدعية. .IP يُقلّص \fImsg_qnum\fP بمقدار 1. .IP يُعيّن \fImsg_rtime\fP إلى الوقت الحالي. .SH "قيمة الإرجاع" عند النجاح، تُرجع \fBmsgsnd\fP() 0 وتُرجع \fBmsgrcv\fP() عدد البايتات المنسوخة فعليًا في مصفوفة \fImtext\fP. عند الفشل، تُرجع كلتا الدالتين \-1، وتُعيّنان \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء يمكن أن تفشل \fBmsgsnd\fP() مع الأخطاء التالية: .TP \fBEACCES\fP لا تملك العملية المستدعية إذن الكتابة على طابور الرسائل، ولا تملك القدرة \fBCAP_IPC_OWNER\fP في مساحة اسم المستخدم التي تحكم مساحة اسم IPC الخاصة بها. .TP \fBEAGAIN\fP لا يمكن إرسال الرسالة بسبب حد \fImsg_qbytes\fP للطابور وتم تحديد \fBIPC_NOWAIT\fP في \fImsgflg\fP. .TP \fBEFAULT\fP العنوان المشار إليه بواسطة \fImsgp\fP غير قابل للوصول. .TP \fBEIDRM\fP حُذف طابور الرسائل. .TP \fBEINTR\fP أثناء النوم على حالة طابور رسائل ممتلئ، التقطت العملية إشارة. .TP \fBEINVAL\fP قيمة \fImsqid\fP غير صالحة، أو قيمة \fImtype\fP غير موجبة، أو قيمة \fImsgsz\fP غير صالحة (أقل من 0 أو أكبر من قيمة النظام \fBMSGMAX\fP). .TP \fBENOMEM\fP لا يملك النظام ذاكرة كافية لعمل نسخة من الرسالة المشار إليها بواسطة \fImsgp\fP. .P يمكن أن تفشل \fBmsgrcv\fP() مع الأخطاء التالية: .TP \fBE2BIG\fP طول نص الرسالة أكبر من \fImsgsz\fP ولم يُحدد \fBMSG_NOERROR\fP في \fImsgflg\fP. .TP \fBEACCES\fP لا تملك العملية المستدعية إذن القراءة على طابور الرسائل، ولا تملك القدرة \fBCAP_IPC_OWNER\fP في مساحة اسم المستخدم التي تحكم مساحة اسم IPC الخاصة بها. .TP \fBEFAULT\fP العنوان المشار إليه بواسطة \fImsgp\fP غير قابل للوصول. .TP \fBEIDRM\fP بينما كانت العملية نائمة لاستقبال رسالة، أُزيل طابور الرسائل. .TP \fBEINTR\fP بينما كانت العملية نائمة لاستقبال رسالة، التقطت العملية إشارة؛ انظر \fBsignal\fP(7). .TP \fBEINVAL\fP كان \fImsqid\fP غير صالح، أو كان \fImsgsz\fP أقل من 0. .TP \fBEINVAL\fP (منذ لينكس 3.14) \fImsgflg\fP حدد \fBMSG_COPY\fP، ولكن ليس \fBIPC_NOWAIT\fP. .TP \fBEINVAL\fP (منذ لينكس 3.14) \fImsgflg\fP حدد كلاً من \fBMSG_COPY\fP و \fBMSG_EXCEPT\fP. .TP \fBENOMSG\fP \fBIPC_NOWAIT\fP تم تحديده في \fImsgflg\fP ولم توجد رسالة من النوع المطلوب في طابور الرسائل. .TP \fBENOMSG\fP \fBIPC_NOWAIT\fP و \fBMSG_COPY\fP تم تحديدهما في \fImsgflg\fP ويحتوي الطابور على أقل من \fImsgtyp\fP رسالة. .TP \fBENOSYS\fP (منذ لينكس 3.8) كلا من \fBMSG_COPY\fP و \fBIPC_NOWAIT\fP تم تحديدهما في \fImsgflg\fP، وتم تكوين هذه النواة بدون \fBCONFIG_CHECKPOINT_RESTORE\fP. .SH المعايير POSIX.1\-2024 XSI. .P .\" MSG_COPY since glibc 2.18 العلمان \fBMSG_EXCEPT\fP و \fBMSG_COPY\fP خاصان بلينكس؛ يمكن الحصول على تعريفاتهما بتعريف ماكرو اختبار الميزة \fB_GNU_SOURCE\fP. .SH التاريخ SVr4, SUSv1, POSIX.1\-2001 XSI. .P الوسيطة \fImsgp\fP مُعلنة كـ \fIstruct\ msgbuf\ *\fP في glibc 2.0 و 2.1. وهي مُعلنة كـ \fIvoid\ *\fP في glibc 2.2 وما بعده، كما هو مطلوب بواسطة SUSv2 و SUSv3. .SH ملاحظات الحدود التالية على موارد طابور الرسائل تؤثر على استدعاء \fBmsgsnd\fP(): .TP \fBMSGMAX\fP الحد الأقصى لحجم نص الرسالة، بالبايت (القيمة المبدئية: 8192 بايت). في لينكس، يمكن قراءة هذا الحد وتعديله عبر \fI/proc/sys/kernel/msgmax\fP. .TP \fBMSGMNB\fP الحد الأقصى لعدد البايتات التي يمكن الاحتفاظ بها في طابور رسائل (القيمة المبدئية: 16384 بايت). في لينكس، يمكن قراءة هذا الحد وتعديله عبر \fI/proc/sys/kernel/msgmnb\fP. يمكن لعملية متميزة (لينكس: عملية مع إمكانية \fBCAP_SYS_RESOURCE\fP) زيادة حجم طابور الرسائل بما يتجاوز \fBMSGMNB\fP باستخدام عملية \fBmsgctl\fP(2) \fBIPC_SET\fP. .P التنفيذ ليس له حدود نظامية جوهرية على عدد رؤوس الرسائل (\fBMSGTQL\fP) وعدد البايتات في مجمع الرسائل (\fBMSGPOOL\fP). .SH العلل .\" http://marc.info/?l=linux-kernel&m=139048542803605&w=2 .\" commit 4f87dac386cc43d5525da7a939d4b4e7edbea22c في لينكس 3.13 وما قبله، إذا تم استدعاء \fBmsgrcv\fP() مع العلم \fBMSG_COPY\fP، ولكن بدون \fBIPC_NOWAIT\fP، واحتوى طابور الرسائل على أقل من \fImsgtyp\fP رسالة، فإن الاستدعاء سينتظر حتى تتم كتابة الرسالة التالية في الطابور. عند تلك النقطة، سيعيد الاستدعاء نسخة من الرسالة، \fIبغض النظر\fP عما إذا كانت تلك الرسالة في الموضع الترتيبي \fImsgtyp\fP. تم إصلاح هذا الخلل في لينكس 3.14. .P .\" http://marc.info/?l=linux-kernel&m=139048542803605&w=2 .\" commit 4f87dac386cc43d5525da7a939d4b4e7edbea22c تحديد كلا من \fBMSG_COPY\fP و \fBMSC_EXCEPT\fP في \fImsgflg\fP هو خطأ منطقي (حيث أن هذه الأعلام تفرض تفسيرات مختلفة على \fImsgtyp\fP). في لينكس 3.13 وما قبله، لم يتم تشخيص هذا الخطأ بواسطة \fBmsgrcv\fP(). تم إصلاح هذا الخلل في لينكس 3.14. .SH أمثلة البرنامج أدناه يوضح استخدام \fBmsgsnd\fP() و \fBmsgrcv\fP(). .P يتم تشغيل البرنامج المثال أولاً مع الخيار \fB\-s\fP لإرسال رسالة ثم تشغيله مرة أخرى مع الخيار \fB\-r\fP لاستقبال رسالة. .P تظهر جلسة الصدفة التالية تشغيلًا نموذجيًا للبرنامج: .P .in +4n .EX $\fB ./a.out \-s\fP sent: a message at Wed Mar 4 16:25:45 2015 .P $\fB ./a.out \-r\fP message received: a message at Wed Mar 4 16:25:45 2015 .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (msgop.c) \& .EX #include #include #include #include #include #include #include \& struct msgbuf { long mtype; char mtext[80]; }; \& static void usage(char *prog_name, char *msg) { if (msg != NULL) fputs(msg, stderr); \& fprintf(stderr, "Usage: %s [options]\[rs]n", prog_name); fprintf(stderr, "Options are:\[rs]n"); fprintf(stderr, "\-s send message using msgsnd()\[rs]n"); fprintf(stderr, "\-r read message using msgrcv()\[rs]n"); fprintf(stderr, "\-t message type (default is 1)\[rs]n"); fprintf(stderr, "\-k message queue key (default is 1234)\[rs]n"); exit(EXIT_FAILURE); } \& static void send_msg(int qid, int msgtype) { time_t t; struct msgbuf msg; \& msg.mtype = msgtype; \& time(&t); snprintf(msg.mtext, sizeof(msg.mtext), "a message at %s", ctime(&t)); \& if (msgsnd(qid, &msg, sizeof(msg.mtext), IPC_NOWAIT) == \-1) { perror("msgsnd error"); exit(EXIT_FAILURE); } printf("sent: %s\[rs]n", msg.mtext); } \& static void get_msg(int qid, int msgtype) { struct msgbuf msg; \& if (msgrcv(qid, &msg, sizeof(msg.mtext), msgtype, MSG_NOERROR | IPC_NOWAIT) == \-1) { if (errno != ENOMSG) { perror("msgrcv"); exit(EXIT_FAILURE); } printf("No message available for msgrcv()\[rs]n"); } else { printf("message received: %s\[rs]n", msg.mtext); } } \& int main(int argc, char *argv[]) { int qid, opt; int mode = 0; /* 1 = send, 2 = receive */ int msgtype = 1; int msgkey = 1234; \& while ((opt = getopt(argc, argv, "srt:k:")) != \-1) { switch (opt) { case \[aq]s\[aq]: mode = 1; break; case \[aq]r\[aq]: mode = 2; break; case \[aq]t\[aq]: msgtype = atoi(optarg); if (msgtype <= 0) usage(argv[0], "\-t option must be greater than 0\[rs]n"); break; case \[aq]k\[aq]: msgkey = atoi(optarg); break; default: usage(argv[0], "Unrecognized option\[rs]n"); } } \& if (mode == 0) usage(argv[0], "must use either \-s or \-r option\[rs]n"); \& qid = msgget(msgkey, IPC_CREAT | 0666); \& if (qid == \-1) { perror("msgget"); exit(EXIT_FAILURE); } \& if (mode == 2) get_msg(qid, msgtype); else send_msg(qid, msgtype); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBmsgctl\fP(2), \fBmsgget\fP(2), \fBcapabilities\fP(7), \fBmq_overview\fP(7), \fBsysvipc\fP(7) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .