fexecve(3)

الاسم
fexecve - تنفيذ برنامج محدد عبر واصف ملف

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

موجز
#include <unistd.h>

int fexecve(int fd, char *const argv[], char *const envp[]);

    متطلبات ماكروات اختبار الميزات لـ glibc (انظر feature_test_macros(7)):

fexecve():
    منذ glibc 2.10:
        _POSIX_C_SOURCE >= 200809L
    قبل glibc 2.10:
        _GNU_SOURCE

الوصف
تؤدي الدالة fexecve() نفس مهمة execve(2)، مع الفارق أن الملف المراد تنفيذه يُحدد عبر واصف ملف، fd، بدلاً من اسم مسار. يجب أن يكون واصف الملف fd مفتوحًا للقراءة فقط (O_RDONLY) أو مع العلم O_PATH ويجب أن يكون لدى المستدعي صلاحية تنفيذ الملف الذي يشير إليه.

قيمة الإرجاع
لا تعود استدعاء ناجح للدالة fexecve() أبدًا. عند الخطأ، تعود الدالة بقيمة -1، ويُضبط errno للإشارة إلى الخطأ.

الأخطاء
الأخطاء مماثلة لتلك الخاصة بـ execve(2)، مع الإضافات التالية:

EINVAL
    fd ليس واصف ملف صالحًا، أو argv يساوي NULL، أو envp يساوي NULL.

ENOENT
    العلم close-on-exec مضبوط على fd، و fd يشير إلى سكريبت. انظر الأخطاء.

ENOSYS
    لا يوفر النواة استدعاء النظام execveat(2)، ولا يمكن الوصول إلى نظام الملفات /proc.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
fexecve() | سلامة الخيوط | MT-Safe

المعايير
POSIX.1-2008.

التاريخ
glibc 2.3.2.

على لينكس مع إصدارات glibc 2.26 وما قبلها، تُنفذ fexecve() باستخدام نظام الملفات proc(5)، لذا يجب أن يكون /proc موصولاً ومتاحًا وقت الاستدعاء. منذ glibc 2.27، إذا دعمت النواة الأساسية استدعاء النظام execveat(2)، فتُنفذ fexecve() باستخدام ذلك الاستدعاء، مع فائدة أن /proc لا يحتاج إلى أن يكون موصولاً.

ملاحظات
الفكرة وراء fexecve() هي السماح للمستدعي بالتحقق (مجموع اختباري) من محتويات ملف قابل للتنفيذ قبل تنفيذه. مجرد فتح الملف، وحساب المجموع الاختباري للمحتويات، ثم تنفيذ execve(2) لن يكون كافيًا، لأنه بين الخطوتين، يمكن استبدال اسم الملف، أو بادئة دليل من اسم المسار (على سبيل المثال، بتعديل هدف رابط رمزي). لا تخفف fexecve() مشكلة أن محتويات ملف يمكن تغييرها بين حساب المجموع الاختباري واستدعاء fexecve()؛ لذلك، الحل هو ضمان أن صلاحيات الملف تمنع تعديله من قبل مستخدمين خبيثين.

الأسلوب الطبيعي عند استخدام fexecve() هو ضبط العلم close-on-exec على fd، بحيث لا يتسرب واصف الملف إلى البرنامج المنفذ. هذا الأسلوب طبيعي لسببين. أولاً، يمنع استهلاك واصفات الملف دون داع. (البرنامج المنفذ عادة لا يحتاج إلى واصف ملف يشير إلى البرنامج نفسه.) ثانيًا، إذا استُخدمت fexecve() بشكل تكراري، فإن استخدام العلم close-on-exec يمنع استنفاد واصفات الملف الذي ينتج عن حقيقة أن كل خطوة في التكرار ستتسبب في تمرير واصف ملف إضافي إلى البرنامج الجديد. (لكن انظر الأخطاء.)

العلل
إذا كان fd يشير إلى سكريبت (أي، إنه ملف نصي قابل للتنفيذ يسمي مفسر سكريبت بسطر أول يبدأ بالحروف #!) وضُبط العلم close-on-exec لـ fd، فتفشل fexecve() مع الخطأ ENOENT. يحدث هذا الخطأ لأنه بحلول وقت تنفيذ مفسر السكريبت، يكون fd قد أُغلق بالفعل بسبب العلم close-on-exec. وبالتالي، لا يمكن ضبط العلم close-on-exec على fd إذا كان يشير إلى سكريبت، مما يؤدي إلى المشاكل الموصوفة في الملاحظات.

انظر أيضًا
execve(2), execveat(2)

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

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

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