.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2002-2020, Michael Kerrisk .\" 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 shm_open 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم shm_open, shm_unlink \- إنشاء/فتح أو فصل كائنات الذاكرة المشتركة POSIX .SH المكتبة مكتبة الوقت الحقيقي (\fIlibrt\fP،\ \fI\-lrt\fP) .SH موجز .nf \fB#include \fP \fB#include \fP /* For mode constants */ \fB#include \fP /* For O_* constants */ .P \fBint shm_open(const char *\fP\fIname\fP\fB, int \fP\fIoflag\fP\fB, mode_t \fP\fImode\fP\fB);\fP \fBint shm_unlink(const char *\fP\fIname\fP\fB);\fP .fi .SH الوصف تنشئ وتفتح الدالة \fBshm_open\fP() كائن ذاكرة مشتركة POSIX جديدًا، أو تفتح كائنًا موجودًا. كائن الذاكرة المشتركة POSIX هو في الواقع مقبض يمكن استخدامه بواسطة عمليات غير مرتبطة لـ \fBmmap\fP(2) نفس منطقة الذاكرة المشتركة. تؤدي الدالة \fBshm_unlink\fP() العملية المعاكسة، بإزالة كائن أُنشئ سابقًا بواسطة \fBshm_open\fP(). .P .\" glibc allows the initial slash to be omitted, and makes .\" multiple initial slashes equivalent to a single slash. .\" This differs from the implementation of POSIX message queues. .\" glibc allows subdirectory components in the name, in which .\" case the subdirectory must exist under /dev/shm, and allow the .\" required permissions if a user wants to create a shared memory .\" object in that subdirectory. عملية \fBshm_open\fP() مماثلة لعملية \fBopen\fP(2). يحدد \fIname\fP كائن الذاكرة المشتركة الذي سيُنشأ أو يُفتح. للاستخدام المحمول، يجب تعريف كائن الذاكرة المشتركة باسم من الشكل \fI/somename\fP؛ أي سلسلة محارف منتهية بقيمة خالية يصل طولها إلى \fBNAME_MAX\fP (أي 255) حرفًا تتكون من شرطة مائلة أولية، متبوعة بحرف واحد أو أكثر، لا تحتوي أي منها على شرطات مائلة. .P \fIoflag\fP هو قناع بتات يُنشأ بواسطة ORing معًا واحدًا بالضبط من \fBO_RDONLY\fP أو \fBO_RDWR\fP وأي من الأعلام الأخرى المدرجة هنا: .TP \fBO_RDONLY\fP يفتح الكائن للوصول للقراءة. يمكن لكائن الذاكرة المشتركة المفتوح بهذه الطريقة أن يُوصل بـ \fBmmap\fP(2) فقط للوصول للقراءة (\fBPROT_READ\fP). .TP \fBO_RDWR\fP يفتح الكائن للوصول للقراءة والكتابة. .TP \fBO_CREAT\fP .\" In truth it is actually the filesystem IDs on Linux, but these .\" are nearly always the same as the effective IDs. (MTK, Jul 05) ينشئ كائن الذاكرة المشتركة إذا لم يكن موجودًا. تُؤخذ ملكية المستخدم والمجموعة للكائن من المعرفات الفعالة المقابلة للعملية المستدعية، وتُضبط أذونات الكائن وفقًا للبتات التسع السفلى من \fImode\fP، باستثناء أن تلك البتات المضبوطة في قناع إنشاء وضع ملف العملية (انظر \fBumask\fP(2)) تُمسح للكائن الجديد. مجموعة من ثوابت الماكرو التي يمكن استخدامها لتعريف \fImode\fP مدرجة في \fBopen\fP(2). (يمكن الحصول على التعريفات الرمزية لهذه الثوابت بتضمين \fI\fP.) .IP كائن الذاكرة المشتركة الجديد له طول صفري مبدئيًا\[em]يمكن ضبط حجم الكائن باستخدام \fBftruncate\fP(2). البايتات المخصصة حديثًا لكائن الذاكرة المشتركة تُهيأ آلي إلى 0. .TP \fBO_EXCL\fP إذا حُدد \fBO_CREAT\fP أيضًا، وكان كائن ذاكرة مشتركة بالاسم \fIname\fP المعطى موجودًا بالفعل، يُرجع خطأ. التحقق من وجود الكائن، وإنشاؤه إذا لم يكن موجودًا، يُنفذان ذريًا. .TP \fBO_TRUNC\fP إذا كان كائن الذاكرة المشتركة موجودًا بالفعل، يُقتص إلى صفر بايت. .P يمكن الحصول على تعريفات قيم الأعلام هذه بتضمين \fI\fP. .P عند الإكمال الناجح، تُرجع \fBshm_open\fP() واصف ملف جديد يشير إلى كائن الذاكرة المشتركة. يُضمن أن واصف الملف هذا هو واصف الملف ذو الرقم الأدنى الذي لم يُفتح سابقًا داخل العملية. يُضبط العلم \fBFD_CLOEXEC\fP (انظر \fBfcntl\fP(2)) لواصف الملف. .P يُستخدم واصف الملف عادةً في الاستدعاءات اللاحقة لـ \fBftruncate\fP(2) (لكائن منشأ حديثًا) و \fBmmap\fP(2). بعد استدعاء \fBmmap\fP(2)، يمكن إغلاق واصف الملف دون التأثير على تعيين الذاكرة. .P عملية \fBshm_unlink\fP() مماثلة لـ \fBunlink\fP(2): تزيل اسم كائن الذاكرة المشتركة، وبمجرد أن تلغي جميع العمليات تعيين الكائن، تُحرر وتدمر محتويات منطقة الذاكرة المرتبطة. بعد \fBshm_unlink\fP() ناجح، تفشل محاولات \fBshm_open\fP() لكائن بنفس \fIname\fP (ما لم يُحدد \fBO_CREAT\fP، وفي هذه الحالة يُنشأ كائن جديد ومتميز). .SH "قيمة الإرجاع" عند النجاح، تُرجع \fBshm_open\fP() واصف ملف (عدد صحيح غير سالب). عند النجاح، تُرجع \fBshm_unlink\fP() 0. عند الفشل، تُرجع كلتا الدالتين \-1 وتضبط \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEACCES\fP رُفض الإذن لـ \fBshm_unlink\fP() لكائن الذاكرة المشتركة. .TP \fBEACCES\fP رُفض الإذن لـ \fBshm_open\fP() \fIname\fP في \fImode\fP المحدد، أو حُدد \fBO_TRUNC\fP وليس للمستدعي إذن كتابة على الكائن. .TP \fBEEXIST\fP حُدد كل من \fBO_CREAT\fP و \fBO_EXCL\fP لـ \fBshm_open\fP() وكائن الذاكرة المشتركة المحدد بواسطة \fIname\fP موجود بالفعل. .TP \fBEINVAL\fP وسيطة \fIname\fP للدالة \fBshm_open\fP() كانت غير صالحة. .TP \fBEMFILE\fP وُصل إلى الحد الأقصى لواصفات الملفات المفتوحة لكل عملية. .TP \fBENAMETOOLONG\fP طول \fIname\fP يتجاوز \fBPATH_MAX\fP. .TP \fBENFILE\fP وُصل إلى الحد الأقصى لإجمالي عدد الملفات المفتوحة على مستوى النظام. .TP \fBENOENT\fP جرت محاولة لاستدعاء \fBshm_open\fP() على \fIname\fP غير موجود، ولم يُحدد \fBO_CREAT\fP. .TP \fBENOENT\fP جرت محاولة لاستدعاء \fBshm_unlink\fP() على \fIname\fP غير موجود. .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBshm_open\fP(), \fBshm_unlink\fP() T} سلامة الخيوط المنطقة (locale) آمنة لتعدد المسالك (MT\-Safe) .TE .SH الإصدارات يترك POSIX سلوك الجمع بين \fBO_RDONLY\fP و \fBO_TRUNC\fP غير محدد. في لينكس، سيؤدي هذا إلى اقتطاع كائن ذاكرة مشتركة موجود بنجاح\[em]قد لا يكون هذا هو الحال في أنظمة UNIX الأخرى. .P يستخدم تطبيق كائن الذاكرة المشتركة POSIX في لينكس نظام ملفات \fBtmpfs\fP(5) مخصص يُوصل عادة تحت \fI/dev/shm\fP. .SH المعايير POSIX.1\-2008. .SH التاريخ glibc 2.2. POSIX.1\-2001. .P ينص POSIX.1\-2001 على أن ملكية المجموعة لكائن ذاكرة مشتركة مُنشأ حديثًا تُضبط إما على معرف المجموعة الفعّال للعملية المستدعية أو "معرف مجموعة مبدئي للنظام". ينص POSIX.1\-2008 على أن ملكية المجموعة قد تُضبط إما على معرف المجموعة الفعّال للعملية المستدعية أو، إذا كان الكائن مرئيًا في نظام الملفات، معرف مجموعة الدليل الأصلي. .SH أمثلة تستخدم البرامج أدناه الذاكرة المشتركة POSIX والإشارات غير المسماة POSIX لتبادل قطعة من البيانات. برنامج "bounce" (الذي يجب تشغيله أولاً) يرفع حالة سلسلة محارف تُوضع في الذاكرة المشتركة بواسطة برنامج "send". بمجرد تعديل البيانات، يطبع برنامج "send" محتويات الذاكرة المشتركة المعدلة. مثال على تنفيذ البرنامجين هو التالي: .P .in +4n .EX $\fB ./pshm_ucase_bounce /myshm &\fP [1] 270171 $\fB ./pshm_ucase_send /myshm hello\fP; HELLO .EE .in .P .\" يُقدم تفصيل إضافي حول هذه البرامج أدناه. .SS "مصدر البرنامج: pshm_ucase.h" يُضمن ملف الرأس التالي بواسطة كلا البرنامجين أدناه. غرضه الرئيسي هو تعريف بنية ستُفرض على كائن الذاكرة المشترك بين البرنامجين. .P .in +4n .\" SRC BEGIN (pshm_ucase.h) .EX #ifndef PSHM_UCASE_H #define PSHM_UCASE_H \& #include #include #include #include #include \& #define BUF_SIZE 1024 /* Maximum size for exchanged string */ \& /* Define a structure that will be imposed on the shared memory object */ \& struct shmbuf { sem_t sem1; /* POSIX unnamed semaphore */ sem_t sem2; /* POSIX unnamed semaphore */ size_t cnt; /* Number of bytes used in \[aq]buf\[aq] */ char buf[BUF_SIZE]; /* Data being transferred */ }; \& #endif // include guard .EE .\" SRC END .in .\" .SS "مصدر البرنامج: pshm_ucase_bounce.c" ينشئ برنامج "bounce" كائن ذاكرة مشتركة جديدًا بالاسم المُعطى في وسيطة سطر الأوامر ويُحدد حجم الكائن ليطابق حجم بنية \fIshmbuf\fP المُعرفة في ملف الرأس. ثم يُخطط الكائن في مساحة عناوين العملية، ويُهيئ إشارتين POSIX داخل الكائن إلى 0. .P بعد أن يُرسل برنامج "send" أول إشارة، يرفع برنامج "bounce" حالة البيانات التي وُضعت في الذاكرة بواسطة برنامج "send" ثم يُرسل الإشارة الثانية ليُخبر برنامج "send" أنه يمكنه الآن الوصول إلى الذاكرة المشتركة. .P .in +4n .\" SRC BEGIN (pshm_ucase_bounce.c) .EX /* pshm_ucase_bounce.c \& Licensed under GNU General Public License v2 or later. */ #include #include #include #include #include #include \& #include "pshm_ucase.h" \& int main(int argc, char *argv[]) { int fd; char *shmpath; struct shmbuf *shmp; \& if (argc != 2) { fprintf(stderr, "Usage: %s /shm\-path\[rs]n", argv[0]); exit(EXIT_FAILURE); } \& shmpath = argv[1]; \& /* Create shared memory object and set its size to the size of our structure. */ \& fd = shm_open(shmpath, O_CREAT | O_EXCL | O_RDWR, 0600); if (fd == \-1) err(EXIT_FAILURE, "shm_open"); \& if (ftruncate(fd, sizeof(struct shmbuf)) == \-1) err(EXIT_FAILURE, "ftruncate"); \& /* Map the object into the caller\[aq]s address space. */ \& shmp = mmap(NULL, sizeof(*shmp), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (shmp == MAP_FAILED) err(EXIT_FAILURE, "mmap"); \& /* Initialize semaphores as process\-shared, with value 0. */ \& if (sem_init(&shmp\->sem1, 1, 0) == \-1) err(EXIT_FAILURE, "sem_init\-sem1"); if (sem_init(&shmp\->sem2, 1, 0) == \-1) err(EXIT_FAILURE, "sem_init\-sem2"); \& /* Wait for \[aq]sem1\[aq] to be posted by peer before touching shared memory. */ \& if (sem_wait(&shmp\->sem1) == \-1) err(EXIT_FAILURE, "sem_wait"); \& /* Convert data in shared memory into upper case. */ \& for (size_t j = 0; j < shmp\->cnt; j++) shmp\->buf[j] = toupper((unsigned char) shmp\->buf[j]); \& /* Post \[aq]sem2\[aq] to tell the peer that it can now access the modified data in shared memory. */ \& if (sem_post(&shmp\->sem2) == \-1) err(EXIT_FAILURE, "sem_post"); \& /* Unlink the shared memory object. Even if the peer process is still using the object, this is okay. The object will be removed only after all open references are closed. */ \& shm_unlink(shmpath); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .in .\" .SS "مصدر البرنامج: pshm_ucase_send.c" يأخذ برنامج "send" وسيطتين لسطر الأوامر: اسم مسار كائن ذاكرة مشتركة مُنشأ سابقًا بواسطة برنامج "bounce" وسلسلة محارف ستُنسخ إلى ذلك الكائن. .P يَفتَح البرنامج كائن الذاكرة المُشتركة ويَربِط الكائن في نطاق عناوينه. ثم يَنسَخ البيانات المُحدَّدة في وسيطه الثاني إلى الذاكرة المُشتركة، ويُطلِق الإشارة الأولى، التي تُخبِر برنامج "الارتداد" أنه يمكنه الآن الوصول إلى تلك البيانات. بعد أن يُطلِق برنامج "الارتداد" الإشارة الثانية، يَطبَع برنامج "الإرسال" محتويات الذاكرة المُشتركة على الخرج القياسي. .P .in +4n .\" SRC BEGIN (pshm_ucase_send.c) .EX /* pshm_ucase_send.c \& Licensed under GNU General Public License v2 or later. */ #include #include #include #include #include #include #include \& #include "pshm_ucase.h" \& int main(int argc, char *argv[]) { int fd; char *shmpath, *string; size_t len; struct shmbuf *shmp; \& if (argc != 3) { fprintf(stderr, "Usage: %s /shm\-path string\[rs]n", argv[0]); exit(EXIT_FAILURE); } \& shmpath = argv[1]; string = argv[2]; len = strlen(string); \& if (len > BUF_SIZE) { fprintf(stderr, "String is too long\[rs]n"); exit(EXIT_FAILURE); } \& /* Open the existing shared memory object and map it into the caller\[aq]s address space. */ \& fd = shm_open(shmpath, O_RDWR, 0); if (fd == \-1) err(EXIT_FAILURE, "shm_open"); \& shmp = mmap(NULL, sizeof(*shmp), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (shmp == MAP_FAILED) err(EXIT_FAILURE, "mmap"); \& /* Copy data into the shared memory object. */ \& shmp\->cnt = len; memcpy(&shmp\->buf, string, len); \& /* Tell peer that it can now access shared memory. */ \& if (sem_post(&shmp\->sem1) == \-1) err(EXIT_FAILURE, "sem_post"); \& /* Wait until peer says that it has finished accessing the shared memory. */ \& if (sem_wait(&shmp\->sem2) == \-1) err(EXIT_FAILURE, "sem_wait"); \& /* Write modified data in shared memory to standard output. */ \& if (write(STDOUT_FILENO, &shmp\->buf, len) == \-1) err(EXIT_FAILURE, "write"); if (write(STDOUT_FILENO, "\[rs]n", 1) == \-1) err(EXIT_FAILURE, "write"); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .in .SH "انظر أيضًا" \fBclose\fP(2), \fBfchmod\fP(2), \fBfchown\fP(2), \fBfcntl\fP(2), \fBfstat\fP(2), \fBftruncate\fP(2), \fBmemfd_create\fP(2), \fBmmap\fP(2), \fBopen\fP(2), \fBumask\fP(2), \fBshm_overview\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 .