.\" -*- coding: UTF-8 -*- .\" Copyright 2020, Stephen Kitt .\" Copyright 2021, 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 close_range 2 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم close_range \- إغلاق كل واصفات الملفات في نطاق معين .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#define _GNU_SOURCE\fP /* انظر feature_test_macros(7) */ \fB#include \fP .P \fB#include \fP /* Definition of \fBCLOSE_RANGE_*\fP constants */ .P \fBint close_range(unsigned int \fP\fIfirst\fP\fB, unsigned int \fP\fIlast\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .SH الوصف استدعاء النظام \fBclose_range\fP() يغلق كل واصفات الملفات المفتوحة من \fIfirst\fP إلى \fIlast\fP (شاملًا). .P الأخطاء عند إغلاق واصف ملف معين تُتجاهل حاليًا. .P \fIflags\fP هو قناع بت يحتوي على 0 أو أكثر مما يلي: .TP \fBCLOSE_RANGE_CLOEXEC\fP (منذ لينكس 5.11) يضبط علم الإغلاق عند التنفيذ على واصفات الملفات المحددة، بدلًا من إغلاقها فورًا. .TP \fBCLOSE_RANGE_UNSHARE\fP يفصل واصفات الملفات المحددة عن أي عمليات أخرى قبل إغلاقها، متجنبًا حالات السباق مع خيوط أخرى تشارك جدول واصفات الملفات. .SH "قيمة الإرجاع" عند النجاح، تُرجع \fBclose_range\fP() 0. عند الخطأ، تُرجع \-1 ويُضبط \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEINVAL\fP \fIflags\fP غير صالح، أو \fIfirst\fP أكبر من \fIlast\fP. .P ما يلي يمكن أن يحدث مع \fBCLOSE_RANGE_UNSHARE\fP (عند بناء جدول الواصفات الجديد): .TP \fBEMFILE\fP عدد واصفات الملفات المفتوحة يتجاوز الحد المحدد في \fI/proc/sys/fs/nr_open\fP (انظر \fBproc\fP(5)). هذا الخطأ يمكن أن يحدث في حالات حيث خُفض ذلك الحد قبل استدعاء \fBclose_range\fP() حيث يُحدد علم \fBCLOSE_RANGE_UNSHARE\fP. .TP \fBENOMEM\fP ذاكرة النواة المتوفرة غير كافية. .SH المعايير لا شيء. .SH التاريخ فري بي إس دي. لينكس 5.9، جليبتك 2.34. .SH ملاحظات .SS "إغلاق كل واصفات الملفات المفتوحة" .\" 278a5fbaed89dacd04e9d052f4594ffd0e0585de لتجنب إغلاق واصفات الملفات بشكل أعمى في نطاق واصفات الملفات الممكنة، يُنفذ هذا أحيانًا (على لينكس) بسرد واصفات الملفات المفتوحة في \fI/proc/self/fd/\fP واستدعاء \fBclose\fP(2) على كل واحد. \fBclose_range\fP() يمكنه التعامل مع هذا دون الحاجة إلى \fI/proc\fP وداخل استدعاء نظام واحد، مما يوفر فوائد أداء كبيرة. .SS "إغلاق واصفات الملفات قبل التنفيذ" .\" 60997c3d45d9a67daf01c56d805ae4fec37e0bd8 يمكن إغلاق واصفات الملفات بأمان باستخدام .P .in +4n .EX /* we don't want anything past stderr here */ close_range(3, \[ti]0U, CLOSE_RANGE_UNSHARE); execve(....); .EE .in .P \fBCLOSE_RANGE_UNSHARE\fP مكافئ من الناحية المفاهيمية لـ .P .in +4n .EX unshare(CLONE_FILES); close_range(first, last, 0); .EE .in .P لكنه يمكن أن يكون أكثر كفاءة: إذا امتد النطاق المفصول إلى ما بعد الحد الأقصى الحالي لعدد واصفات الملفات المخصصة في جدول واصفات ملفات المستدعي (الحالة الشائعة عندما يكون \fIlast\fP هو \[ti]0U)، سيفصل النواة جدول واصفات ملفات جديد للمستدعي حتى \fIfirst\fP، ناسخًا أقل عدد ممكن من واصفات الملفات. هذا يتجنب استدعاءات \fBclose\fP(2) اللاحقة تمامًا؛ تكتمل العملية بأكملها بمجرد فصل الجدول. .SS "إغلاق الملفات عند \f[I]التنفيذ\fB" .\" 582f1fb6b721facf04848d2ca57f34468da1813e هذا مفيد بشكل خاص في الحالات حيث خطوات الإعداد المتعددة قبل \fBexec\fP تخاطر بالتعارض مع بعضها البعض. على سبيل المثال، إعداد تشكيلة \fBseccomp\fP(2) يمكن أن يتعارض مع استدعاء \fBclose_range\fP(): إذا أغلقت واصفات الملفات قبل إعداد تشكيلة \fBseccomp\fP(2)، لا يمكن لإعداد التشكيلة استخدامها بنفسها، أو التحكم في إغلاقها؛ إذا أغلقت واصفات الملفات بعد ذلك، لا يمكن لتشكيلة seccomp حظر استدعاء \fBclose_range\fP() أو أي بدائل. استخدام \fBCLOSE_RANGE_CLOEXEC\fP يتجنب هذا: يمكن وضع علامة على الواصفات قبل إعداد تشكيلة \fBseccomp\fP(2)، ويمكن للتشكيلة التحكم في الوصول إلى \fBclose_range\fP() دون التأثير على عملية الاستدعاء. .SH أمثلة البرنامج الموضح أدناه يفتح الملفات المسماة في وسائط سطر الأوامر الخاصة به، يعرض قائمة الملفات التي فتحها (بالتكرار عبر الإدخالات في \fI/proc/PID/fd\fP)، يستخدم \fBclose_range\fP() لإغلاق كل واصفات الملفات الأكبر من أو تساوي 3، ثم يعرض مرة أخرى قائمة الملفات المفتوحة للعملية. المثال التالي يوضح استخدام البرنامج: .P .in +4n .EX $\fB touch /tmp/a /tmp/b /tmp/c\fP; $\fB ./a.out /tmp/a /tmp/b /tmp/c\fP; /tmp/a opened as FD 3 /tmp/b opened as FD 4 /tmp/c opened as FD 5 /proc/self/fd/0 ==> /dev/pts/1 /proc/self/fd/1 ==> /dev/pts/1 /proc/self/fd/2 ==> /dev/pts/1 /proc/self/fd/3 ==> /tmp/a /proc/self/fd/4 ==> /tmp/b /proc/self/fd/5 ==> /tmp/c /proc/self/fd/6 ==> /proc/9005/fd ========= About to call close_range() ======= /proc/self/fd/0 ==> /dev/pts/1 /proc/self/fd/1 ==> /dev/pts/1 /proc/self/fd/2 ==> /dev/pts/1 /proc/self/fd/3 ==> /proc/9005/fd .EE .in .P لاحظ أن الأسطر التي تظهر اسم المسار \fI/proc/9005/fd\fP تنتج عن استدعاءات \fBopendir\fP(3). .SS "مصدر البرنامج" .\" SRC BEGIN (close_range.c) \& .EX #define _GNU_SOURCE #include #include #include #include #include #include #include \& /* إظهار محتويات الروابط الرمزية في /proc/self/fd */ \& static void show_fds(void) { DIR *dirp; char path[PATH_MAX], target[PATH_MAX]; ssize_t len; struct dirent *dp; \& dirp = opendir("/proc/self/fd"); if (dirp == NULL) { perror("opendir"); exit(EXIT_FAILURE); } \& for (;;) { dp = readdir(dirp); if (dp == NULL) break; \& if (dp\->d_type == DT_LNK) { snprintf(path, sizeof(path), "/proc/self/fd/%s", dp\->d_name); \& len = readlink(path, target, sizeof(target)); printf("%s ==> %.*s\[rs]n", path, (int) len, target); } } \& closedir(dirp); } \& int main(int argc, char *argv[]) { int fd; \& for (size_t j = 1; j < argc; j++) { fd = open(argv[j], O_RDONLY); if (fd == \-1) { perror(argv[j]); exit(EXIT_FAILURE); } printf("%s opened as FD %d\[rs]n", argv[j], fd); } \& show_fds(); \& printf("========= About to call close_range() =======\[rs]n"); \& if (close_range(3, \[ti]0U, 0) == \-1) { perror("close_range"); exit(EXIT_FAILURE); } \& show_fds(); exit(EXIT_FAILURE); } .EE .\" SRC END .SH "انظر أيضًا" \fBclose\fP(2) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .