execveat(2)

الاسم
execveat - تنفيذ برنامج نسبةً إلى واصف ملف دليل

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

موجز
#include <linux/fcntl.h>      /* Definition of AT_* constants */
#include <unistd.h>

int execveat(int dirfd, const char *path,
             char *const _Nullable argv[],
             char *const _Nullable envp[],
             int flags);

الوصف
استدعاء النظام execveat() ينفذ البرنامج المشار إليه بمزيج من dirfd و path. يعمل بنفس طريقة execve(2) تماماً، باستثناء الاختلافات الموصوفة في صفحة الدليل هذه.

إذا كان path نسبياً، فسيُفسر نسبةً إلى الدليل المشار إليه بواسطة واصف الملف dirfd (بدلاً من نسبته إلى دليل العمل الحالي للعملية المستدعية، كما تفعل execve(2) لاسم مسار نسبي).

إذا كان path نسبياً وكان dirfd هو القيمة الخاصة AT_FDCWD، فسيُفسر path نسبةً إلى دليل العمل الحالي للعملية المستدعية (مثل execve(2)).

إذا كان المسار path مطلقاً، فُيتجاهل dirfd.

إذا كان path سلسلة فارغة وتم تحديد العلم AT_EMPTY_PATH، فإن واصف الملف dirfd يحدد الملف المراد تنفيذه (أي dirfd يشير إلى ملف قابل للتنفيذ، وليس دليلاً).

الوسيطة flags هي قناع بت يمكن أن يتضمن صفراً أو أكثر من الأعلام التالية:

AT_EMPTY_PATH
    إذا كان path سلسلة فارغة، فاعمل على الملف المشار إليه بواسطة dirfd (الذي قد يكون تم الحصول عليه باستخدام العلم O_PATH من open(2)).

AT_SYMLINK_NOFOLLOW
    إذا كان الملف المحدد بواسطة dirfd و path غير NULL هو رابط رمزي، فسيفشل الاستدعاء مع الخطأ ELOOP.

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

الأخطاء
نفس الأخطاء التي تحدث لـ execve(2) يمكن أن تحدث أيضًا لـ execveat(). يمكن أن تحدث الأخطاء الإضافية التالية لـ execveat():

مسار
    نسبي لكن dirfd ليس AT_FDCWD ولا واصف ملف صالح.

EINVAL
    راية غير صالحة محددة في flags.

ELOOP
    flags يتضمن AT_SYMLINK_NOFOLLOW والملف المحدد بواسطة dirfd و path غير NULL هو رابط رمزي.

ENOENT
    البرنامج المحدد بواسطة dirfd و path يتطلب استخدام برنامج مفسر (مثل سكريبت يبدأ بـ "#!")، لكن واصف الملف dirfd فُتح مع العلم O_CLOEXEC، مما يؤدي إلى عدم إمكانية وصول المفسر المُطلق إلى ملف البرنامج. انظر BUGS.

ENOTDIR
    المسار path نسبي و dirfd هو واصف ملف يشير إلى ملف غير الدليل.

المعايير
لينكس.

التاريخ
لينكس 3.19، glibc 2.34.

ملاحظات
بالإضافة إلى الأسباب المفسرة في openat(2)، فإن استدعاء النظام execveat() مطلوب أيضًا للسماح بتنفيذ fexecve(3) على الأنظمة التي لا تحتوي على نظام الملفات /proc موصولاً.

عند طلب تنفيذ ملف سكريبت، فإن argv[0] الذي يُمرر إلى مفسر السكريبت هو سلسلة من الشكل /dev/fd/N أو /dev/fd/N/P، حيث N هو رقم واصف الملف الممرر عبر الوسيطة dirfd. تحدث سلسلة من الشكل الأول عند استخدام AT_EMPTY_PATH. تحدث سلسلة من الشكل الثاني عند تحديد السكريبت عبر كل من dirfd و path؛ في هذه الحالة، P هو القيمة المعطاة في path.

لنفس الأسباب الموصوفة في fexecve(3)، فإن الأسلوب الطبيعي عند استخدام execveat() هو ضبط علم الإغلاق عند التنفيذ على dirfd. (لكن انظر BUGS.)

العلل
الخطأ ENOENT الموصوف أعلاه يعني أنه ليس من الممكن ضبط علم الإغلاق عند التنفيذ على واصف الملف المعطى لاستدعاء من الشكل:

    execveat(fd, "", argv, envp, AT_EMPTY_PATH);

مع ذلك، فإن عدم القدرة على ضبط علم الإغلاق عند التنفيذ يعني أن واصف ملف يشير إلى السكريبت يتسرب إلى السكريبت نفسه. بالإضافة إلى إهدار واصف ملف، يمكن أن يؤدي هذا التسرب إلى استنفاد واصفات الملف في السيناريوهات حيث تستخدم السكريبتات execveat() بشكل تكراري.

انظر أيضًا
execve(2), openat(2), fexecve(3)

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

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

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