.\" -*- coding: UTF-8 -*- .\" Copyright 2014, Michael Kerrisk .\" Copyright 2014, David Herrmann .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH memfd_create 2 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم memfd_create \- إنشاء ملف مجهول .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#define _GNU_SOURCE\fP /* انظر feature_test_macros(7) */ \fB#include \fP .P \fBint memfd_create(const char *\fP\fIname\fP\fB, unsigned int \fP\fIflags\fP\fB);\fP .fi .SH الوصف .\" David Herrmann: .\" memfd uses VM_NORESERVE so each page is accounted on first access. .\" This means, the overcommit-limits (see __vm_enough_memory()) and the .\" memory-cgroup limits (mem_cgroup_try_charge()) are applied. Note that .\" those are accounted on "current" and "current->mm", that is, the .\" process doing the first page access. تنشئ \fBmemfd_create\fP() ملفًا مجهولًا وتعيد واصف ملف يشير إليه. يتصرف الملف كملف عادي، وبالتالي يمكن تعديله، واقتطاعه، وتعيينه في الذاكرة، وما إلى ذلك. ومع ذلك، على عكس الملف العادي، فهو موجود في ذاكرة الوصول العشوائي (RAM) وله تخزين دعم متطاير. بمجرد إسقاط جميع المراجع إلى الملف، يتم تحريره آليًا. تُستخدم الذاكرة المجهولة لجميع صفحات الدعم للملف. لذلك، فإن الملفات التي تم إنشاؤها بواسطة \fBmemfd_create\fP() لها نفس دلالات تخصيصات الذاكرة المجهولة الأخرى مثل تلك المخصصة باستخدام \fBmmap\fP(2) مع العلم \fBMAP_ANONYMOUS\fP. .P يُضبط الحجم الأولي للملف على 0. بعد الاستدعاء، يجب ضبط حجم الملف باستخدام \fBftruncate\fP(2). (بدلاً من ذلك، يمكن ملء الملف باستدعاءات \fBwrite\fP(2) أو ما شابه ذلك.) .P يُستخدم الاسم المقدم في \fIname\fP كاسم ملف وسيُعرض كهدف للارتباط الرمزي المقابل في الدليل \fI/proc/self/fd/\fP. يُسبق الاسم المعروض دائمًا بـ \fImemfd:\fP ويخدم أغراض التصحيح فقط. لا تؤثر الأسماء على سلوك واصف الملف، وبالتالي يمكن أن تحمل ملفات متعددة نفس الاسم دون أي آثار جانبية. .P يمكن إجراء عملية OR بتية على القيم التالية في \fIflags\fP لتغيير سلوك \fBmemfd_create\fP(): .TP \fBMFD_CLOEXEC\fP اضبط علامة الإغلاق عند التنفيذ (\fBFD_CLOEXEC\fP) على واصف الملف الجديد. انظر وصف العلامة \fBO_CLOEXEC\fP في \fBopen\fP(2) للأسباب التي تجعل هذا مفيدًا. .TP \fBMFD_ALLOW_SEALING\fP .\" FIXME Why is the MFD_ALLOW_SEALING behavior not simply the default? .\" Is it worth adding some text explaining this? السماح بعمليات الختم على هذا الملف. انظر مناقشة عمليات \fBF_ADD_SEALS\fP و \fBF_GET_SEALS\fP في \fBfcntl\fP(2)، وأيضًا الملاحظات أدناه. المجموعة الأولية من الأختام فارغة. إذا لم يتم تعيين هذا العلم، ستكون المجموعة الأولية من الأختام هي \fBF_SEAL_SEAL\fP، مما يعني أنه لا يمكن تعيين أختام أخرى على الملف. .TP \fBMFD_HUGETLB\fP (منذ Linux 4.14) .\" commit 749df87bd7bee5a79cef073f5d032ddb2b211de8 .\" commit 47b9012ecdc747f6936395265e677d41e11a31ff سيتم إنشاء الملف المجهول في نظام الملفات hugetlbfs باستخدام الصفحات الضخمة. راجع ملف مصدر نواة Linux \fIDocumentation/admin\-guide/mm/hugetlbpage.rst\fP لمزيد من المعلومات حول hugetlbfs. يُدعم تحديد كل من \fBMFD_HUGETLB\fP و \fBMFD_ALLOW_SEALING\fP في \fIflags\fP منذ Linux 4.16. .TP \fBMFD_HUGE_2MB\fP .TQ \fBMFD_HUGE_1GB\fP .TQ \&.\|.\|. يُستخدم بالتزامن مع \fBMFD_HUGETLB\fP لتحديد أحجام صفحات hugetlb بديلة (على التوالي، 2\ ميجابايت، 1\ جيجابايت، ...) على الأنظمة التي تدعم أحجام صفحات hugetlb متعددة. تُضمن تعريفات أحجام الصفحات الضخمة المعروفة في ملف الرأس \fI.\fP .IP للحصول على تفاصيل حول ترميز أحجام الصفحات الضخمة غير المضمنة في ملف الرأس، راجع مناقشة الثوابت المماثلة في التسمية في \fBmmap\fP(2). .P يجب أن تكون البتات غير المستخدمة في \fIflags\fP صفرًا. .P كقيمة إرجاع، تُعيد \fBmemfd_create\fP() واصف ملف جديد يمكن استخدامه للإشارة إلى الملف. يُفتح واصف الملف هذا للقراءة والكتابة (\fBO_RDWR\fP) ويُضبط \fBO_LARGEFILE\fP لواصف الملف. .P فيما يتعلق بـ \fBfork\fP(2) و \fBexecve\fP(2)، تنطبق الدلالات المعتادة على واصف الملف الذي تم إنشاؤه بواسطة \fBmemfd_create\fP(). ترث العملية التابعة الناتجة عن \fBfork\fP(2) نسخة من واصف الملف وتشير إلى نفس الملف. يُحتفظ بواصف الملف عبر \fBexecve\fP(2)، ما لم يتم تعيين علم الإغلاق عند التنفيذ. .SH "قيمة الإرجاع" عند النجاح، تُعيد \fBmemfd_create\fP() واصف ملف جديد. عند الخطأ، تُعيد \-1 ويُضبط \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEFAULT\fP يشير العنوان في \fIname\fP إلى ذاكرة غير صالحة. .TP \fBEINVAL\fP تضمن \fIflags\fP بتات غير معروفة. .TP \fBEINVAL\fP .\" NAME_MAX - strlen("memfd:") كان \fIname\fP طويلًا جدًا. (الحد هو 249 بايت، باستثناء البايت الصفري الختامي.) .TP \fBEINVAL\fP تم تحديد كل من \fBMFD_HUGETLB\fP و \fBMFD_ALLOW_SEALING\fP في \fIflags\fP. .TP \fBEMFILE\fP وُصل إلى الحد الأقصى لواصفات الملفات المفتوحة لكل عملية. .TP \fBENFILE\fP وُصل إلى الحد الأقصى لإجمالي عدد الملفات المفتوحة على مستوى النظام. .TP \fBENOMEM\fP لم تكن الذاكرة كافية لإنشاء ملف مجهول جديد. .TP \fBEPERM\fP تم تحديد العلم \fBMFD_HUGETLB\fP، لكن المتصل لم يكن متميزًا (لم يكن لديه القدرة \fBCAP_IPC_LOCK\fP) وليس عضوًا في مجموعة \fIhugetlb_shm_group\fP؛ راجع وصف \fI/proc/sys/vm/hugetlb_shm_group\fP في \fBproc_sys_vm\fP(5). .SH المعايير لينكس. .SH التاريخ Linux 3.17، glibc 2.27. .SH ملاحظات .\" See also http://lwn.net/Articles/593918/ .\" and http://lwn.net/Articles/594919/ and http://lwn.net/Articles/591108/ يوفر استدعاء النظام \fBmemfd_create\fP() بديلاً بسيطًا لتركيب نظام الملفات \fBtmpfs\fP(5) يدويًا وإنشاء وفتح ملف في ذلك النظام. الغرض الرئيسي من \fBmemfd_create\fP() هو إنشاء ملفات وواصفات الملفات المرتبطة بها المستخدمة مع واجهات برمجة تطبيقات ختم الملفات المقدمة بواسطة \fBfcntl\fP(2). .P للاستدعاء النظام \fBmemfd_create\fP() استخدامات أيضًا بدون ختم الملف (ولهذا السبب يتم تعطيل ختم الملف، ما لم يُطلب صراحةً باستخدام العلم \fBMFD_ALLOW_SEALING\fP). على وجه الخصوص، يمكن استخدامه كبديل لإنشاء ملفات في \fItmp\fP أو كبديل لاستخدام \fBopen\fP(2) \fBO_TMPFILE\fP في الحالات التي لا توجد فيها نية لربط الملف الناتج فعليًا بنظام الملفات. .SS "ختم الملف" في غياب ختم الملف، يجب على العمليات التي تتواصل عبر الذاكرة المشتركة إما أن تثق ببعضها البعض، أو تتخذ إجراءات للتعامل مع احتمال أن يقوم نظير غير موثوق بمعالجة منطقة الذاكرة المشتركة بطرق إشكالية. على سبيل المثال، قد يقوم نظير غير موثوق بتعديل محتويات الذاكرة المشتركة في أي وقت، أو تقليص منطقة الذاكرة المشتركة. الاحتمال الأول يجعل العملية المحلية عرضة لحالات سباق وقت الفحص إلى وقت الاستخدام (يتم التعامل معها عادةً عن طريق نسخ البيانات من منطقة الذاكرة المشتركة قبل فحصها واستخدامها). الاحتمال الثاني يجعل العملية المحلية عرضة لإشارات \fBSIGBUS\fP عند محاولة الوصول إلى موقع غير موجود الآن في منطقة الذاكرة المشتركة. (يتطلب التعامل مع هذا الاحتمال استخدام معالج لإشارة \fBSIGBUS\fP.) .P يفرض التعامل مع النظائر غير الموثوقة تعقيدًا إضافيًا على الكود الذي يستخدم الذاكرة المشتركة. يتيح ختم الذاكرة إزالة هذا التعقيد الإضافي، من خلال السماح لعملية بالعمل بأمان مع العلم أن نظيرها لا يمكنه تعديل الذاكرة المشتركة بطريقة غير مرغوب فيها. .P مثال على استخدام آلية الختم كما يلي: .IP (1) 5 تنشئ العملية الأولى ملف \fBtmpfs\fP(5) باستخدام \fBmemfd_create\fP(). تُرجع الاستدعاء واصف ملف يُستخدم في الخطوات اللاحقة. .IP (2) تحدد العملية الأولى حجم الملف الذي أُنشئ في الخطوة السابقة باستخدام \fBftruncate\fP(2)، وتُخططه باستخدام \fBmmap\fP(2)، وتملأ الذاكرة المشتركة بالبيانات المطلوبة. .IP (3) تستخدم العملية الأولى عملية \fBfcntl\fP(2) \fBF_ADD_SEALS\fP لوضع ختم واحد أو أكثر على الملف، لتقييد التعديلات الإضافية على الملف. (إذا تم وضع الختم \fBF_SEAL_WRITE\fP، فسيكون من الضروري أولاً إلغاء تخطيط التعيين المشترك القابل للكتابة الذي أُنشئ في الخطوة السابقة. وإلا، يمكن تحقيق سلوك مشابه لـ \fBF_SEAL_WRITE\fP باستخدام \fBF_SEAL_FUTURE_WRITE\fP، الذي يمنع عمليات الكتابة المستقبلية عبر \fBmmap\fP(2) و \fBwrite\fP(2) من النجاح مع الاحتفاظ بالتعيينات المشتركة القابلة للكتابة الحالية). .IP (4) تحصل عملية ثانية على واصف ملف لملف \fBtmpfs\fP(5) وتُخططه. من بين الطرق الممكنة لحدوث ذلك ما يلي: .RS .IP \[bu] 3 يمكن للعملية التي استدعت \fBmemfd_create\fP() نقل واصف الملف الناتج إلى العملية الثانية عبر مقبس نطاق UNIX (انظر \fBunix\fP(7) و \fBcmsg\fP(3)). ثم تُخطط العملية الثانية الملف باستخدام \fBmmap\fP(2). .IP \[bu] تُنشأ العملية الثانية عبر \fBfork\fP(2) وبالتالي ترث آلياً واصف الملف والتعيين. (لاحظ أنه في هذه الحالة والحالة التالية، توجد علاقة ثقة طبيعية بين العمليتين، حيث تعملان تحت نفس معرف المستخدم. لذلك، لن يكون ختم الملف ضرورياً عادةً.) .IP \[bu] تفتح العملية الثانية الملف \fI/proc/\fPpid\fI/fd/\fPfd، حيث \fI\fP هو PID العملية الأولى (التي استدعت \fBmemfd_create\fP())، و \fI\fP هو رقم واصف الملف الذي أرجعته استدعاء \fBmemfd_create\fP() في تلك العملية. ثم تُخطط العملية الثانية الملف باستخدام \fBmmap\fP(2). .RE .IP (5) تستخدم العملية الثانية عملية \fBfcntl\fP(2) \fBF_GET_SEALS\fP لاسترجاع قناع البت للأختام التي طُبقت على الملف. يمكن فحص قناع البت هذا لتحديد أنواع القيود التي فُرضت على تعديلات الملف. إذا رغبت، يمكن للعملية الثانية تطبيق أختام إضافية لفرض قيود إضافية (طالما لم يُطبق ختم \fBF_SEAL_SEAL\fP بعد). .SH أمثلة فيما يلي برنامجان مثالان يوضحان استخدام \fBmemfd_create\fP() وواجهة برمجة تطبيقات ختم الملف. .P البرنامج الأول، \fIt_memfd_create.c\fP، ينشئ ملف \fBtmpfs\fP(5) باستخدام \fBmemfd_create\fP()، ويحدد حجماً للملف، ويُخططه في الذاكرة، ويضع اختيارياً بعض الأختام على الملف. يقبل البرنامج ما يصل إلى ثلاث وسائط لسطر الأوامر، أول اثنتين منها مطلوبتان. الوسيطة الأولى هي الاسم المرتبط بالملف، والوسيطة الثانية هي الحجم الذي سيُحدد للملف، والوسيطة الثالثة الاختيارية هي سلسلة من الأحرف تحدد الأختام التي ستوضع على الملف. .P البرنامج الثاني، \fIt_get_seals.c\fP، يمكن استخدامه لفتح ملف موجود أُنشئ عبر \fBmemfd_create\fP() وفحص مجموعة الأختام التي طُبقت على ذلك الملف. .P توضح جلسة الصدفة التالية استخدام هذه البرامج. أولاً ننشئ ملف \fBtmpfs\fP(5) ونضع بعض الأختام عليه: .P .in +4n .EX $\fB ./t_memfd_create my_memfd_file 4096 sw &\fP [1] 11775 PID: 11775;\& fd: 3;\& /proc/11775/fd/3 .EE .in .P في هذه المرحلة، يستمر برنامج \fIt_memfd_create\fP في العمل في الخلفية. من برنامج آخر، يمكننا الحصول على واصف ملف للملف الذي أنشأه \fBmemfd_create\fP() بفتح ملف \fI/proc/\fPpid\fI/fd\fP الذي يتوافق مع واصف الملف الذي فتحه \fBmemfd_create\fP(). باستخدام اسم المسار هذا، نفحص محتوى الرابط الرمزي \fI/proc/\fPpid\fI/fd\fP، ونستخدم برنامج \fIt_get_seals\fP لعرض الأختام التي وُضعت على الملف: .P .in +4n .EX $\fB readlink /proc/11775/fd/3\fP; /memfd:my_memfd_file (deleted) $\fB ./t_get_seals /proc/11775/fd/3\fP; Existing seals: WRITE SHRINK .EE .in .SS "مصدر البرنامج: t_memfd_create.c" .\" SRC BEGIN (t_memfd_create.c) \& .EX #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include \& int main(int argc, char *argv[]) { int fd; char *name, *seals_arg; ssize_t size; unsigned int seals; \& if (argc < 3) { fprintf(stderr, "%s name size [seals]\[rs]n", argv[0]); fprintf(stderr, "\[rs]t\[aq]seals\[aq] can contain any of the " "following characters:\[rs]n"); fprintf(stderr, "\[rs]t\[rs]tg \- F_SEAL_GROW\[rs]n"); fprintf(stderr, "\[rs]t\[rs]ts \- F_SEAL_SHRINK\[rs]n"); fprintf(stderr, "\[rs]t\[rs]tw \- F_SEAL_WRITE\[rs]n"); fprintf(stderr, "\[rs]t\[rs]tW \- F_SEAL_FUTURE_WRITE\[rs]n"); fprintf(stderr, "\[rs]t\[rs]tS \- F_SEAL_SEAL\[rs]n"); exit(EXIT_FAILURE); } \& name = argv[1]; size = atoi(argv[2]); seals_arg = argv[3]; \& /* Create an anonymous file in tmpfs; allow seals to be placed on the file. */ \& fd = memfd_create(name, MFD_ALLOW_SEALING); if (fd == \-1) err(EXIT_FAILURE, "memfd_create"); \& /* Size the file as specified on the command line. */ \& if (ftruncate(fd, size) == \-1) err(EXIT_FAILURE, "truncate"); \& printf("PID: %jd; fd: %d; /proc/%jd/fd/%d\[rs]n", (intmax_t) getpid(), fd, (intmax_t) getpid(), fd); \& /* Code to map the file and populate the mapping with data omitted. */ \& /* If a \[aq]seals\[aq] command\-line argument was supplied, set some seals on the file. */ \& if (seals_arg != NULL) { seals = 0; \& if (strchr(seals_arg, \[aq]g\[aq]) != NULL) seals |= F_SEAL_GROW; if (strchr(seals_arg, \[aq]s\[aq]) != NULL) seals |= F_SEAL_SHRINK; if (strchr(seals_arg, \[aq]w\[aq]) != NULL) seals |= F_SEAL_WRITE; if (strchr(seals_arg, \[aq]W\[aq]) != NULL) seals |= F_SEAL_FUTURE_WRITE; if (strchr(seals_arg, \[aq]S\[aq]) != NULL) seals |= F_SEAL_SEAL; \& if (fcntl(fd, F_ADD_SEALS, seals) == \-1) err(EXIT_FAILURE, "fcntl"); } \& /* Keep running, so that the file created by memfd_create() continues to exist. */ \& pause(); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SS "مصدر البرنامج: t_get_seals.c" .\" SRC BEGIN (t_get_seals.c) \& .EX #define _GNU_SOURCE #include #include #include #include \& int main(int argc, char *argv[]) { int fd; unsigned int seals; \& if (argc != 2) { fprintf(stderr, "%s /proc/PID/fd/FD\[rs]n", argv[0]); exit(EXIT_FAILURE); } \& fd = open(argv[1], O_RDWR); if (fd == \-1) err(EXIT_FAILURE, "open"); \& seals = fcntl(fd, F_GET_SEALS); if (seals == \-1) err(EXIT_FAILURE, "fcntl"); \& printf("Existing seals:"); if (seals & F_SEAL_SEAL) printf(" SEAL"); if (seals & F_SEAL_GROW) printf(" GROW"); if (seals & F_SEAL_WRITE) printf(" WRITE"); if (seals & F_SEAL_FUTURE_WRITE) printf(" FUTURE_WRITE"); if (seals & F_SEAL_SHRINK) printf(" SHRINK"); printf("\[rs]n"); \& /* Code to map the file and access the contents of the resulting mapping omitted. */ \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBfcntl\fP(2), \fBftruncate\fP(2), \fBmemfd_secret\fP(2), \fBmmap\fP(2), \fBshmget\fP(2), \fBshm_open\fP(3) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .