exec(3)

الاسم
execl, execlp, execle, execv, execvp, execvpe - نفذ ملف

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

موجز
#include <unistd.h>

extern char **environ;

int execl(const char *path, const char *arg, ...
/*, (char *) NULL */);
int execlp(const char *file, const char *arg, ...
/*, (char *) NULL */);
int execle(const char *path, const char *arg, ...
                /*, (char *) NULL, char *const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);

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

execvpe():
    _GNU_SOURCE

الوصف
عائلة الدوال exec() تستبدل صورة العملية الحالية بصورة عملية جديدة. الدوال الموصوفة في صفحة الدليل هذه مبنية فوق execve(2). (انظر صفحة الدليل لـ execve(2) لمزيد من التفاصيل حول استبدال صورة العملية الحالية.)

الوسيط الأول لهذه الدوال هو اسم ملف يُراد تنفيذه.

يمكن تجميع الدوال بناءً على الحروف التي تتبع البادئة "exec".

  l - execl(), execlp(), execle()
يمكن اعتبار const char *arg والنقاط اللاحقة على أنها arg0, arg1, ..., argn. معًا تصف قائمة من مؤشر واحد أو أكثر لسلاسل محارف منتهية بقيمة خالية تمثل قائمة الوسائط المتاحة للبرنامج المنفذ. الوسيط الأول، حسب الاتفاق، يجب أن يشير إلى اسم الملف المرتبط بالملف الجاري تنفيذه. قائمة الوسائط يجب أن تُنهى بمؤشر خالٍ، وبما أن هذه دوال متغيرة، يجب تحويل هذا المؤشر إلى (char *) NULL.

على النقيض من دوال 'l'، دوال 'v' (أدناه) تحدد وسائط سطر الأوامر للبرنامج المنفذ كمصفوفة.

  v - execv(), execvp(), execvpe()
الوسيط char *const argv[] هو مصفوفة من مؤشرات لسلاسل محارف منتهية بقيمة خالية تمثل قائمة الوسائط المتاحة للبرنامج الجديد. الوسيط الأول، حسب الاتفاق، يجب أن يشير إلى اسم الملف المرتبط بالملف الجاري تنفيذه. مصفوفة المؤشرات يجب أن تُنهى بمؤشر خالٍ.

  e - execle(), execvpe()
بيئة صورة العملية الجديدة تُحدد عبر الوسيط envp. الوسيط envp هو مصفوفة من مؤشرات لسلاسل محارف منتهية بقيمة خالية ويجب أن تُنهى بمؤشر خالٍ.

جميع دوال exec() الأخرى (التي لا تتضمن 'e' في اللاحقة) تأخذ البيئة لصورة العملية الجديدة من المتغير الخارجي environ في العملية المستدعية.

  p - execlp(), execvp(), execvpe()
هذه الدوال تكرر إجراءات الصدفة في البحث عن ملف قابل للتنفيذ إذا كان اسم الملف المحدد لا يحتوي على حرف شرطة مائلة (/). يُبحث عن الملف في قائمة مسارات الدلائل المفصولة بنقطتين والمحددة في متغير البيئة PATH. إذا لم يُعرف هذا المتغير، فقائمة المسار تكون مبدئيًا قائمة تتضمن الدلائل التي أرجعتها confstr(_CS_PATH) (والتي ترجع عادةً القيمة "/bin:/usr/bin") وربما أيضًا دليل العمل الحالي؛ انظر VERSIONS لمزيد من التفاصيل.

execvpe() يبحث عن البرنامج باستخدام قيمة PATH من بيئة المستدعي، وليس من الوسيط envp.

إذا تضمن اسم الملف المحدد حرف شرطة مائلة، فـ PATH يُتجاهل، ويُنفذ الملف في اسم المسار المحدد.

بالإضافة إلى ذلك، تُعالج بعض الأخطاء بشكل خاص.

إذا رُفض الإذن لملف (فشلت محاولة execve(2) مع الخطأ EACCES)، ستواصل هذه الدوال البحث في باقي مسار البحث. ولكن إذا لم يُعثر على ملف آخر، فستعود مع تعيين errno إلى EACCES.

إذا لم يُتعرف على رأس ملف (فشلت محاولة execve(2) مع الخطأ ENOEXEC)، ستنفذ هذه الدوال الصدفة (/bin/sh) مع مسار الملف كوسيطها الأول. (إذا فشلت هذه المحاولة، لا يُجرى مزيد من البحث.)

جميع دوال exec() الأخرى (التي لا تتضمن 'p' في اللاحقة) تأخذ كوسيطها الأول اسم مسار (نسبي أو مطلق) يُحدد البرنامج المراد تنفيذه.

قيمة الإرجاع
دوال exec() لا تعود إلا إذا حدث خطأ. قيمة الإرجاع هي -1، ويُعيّن errno للإشارة إلى الخطأ.

الأخطاء
جميع هذه الدوال قد تفشل وتُعيّن errno لأي من الأخطاء المحددة لـ execve(2).

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
execl(), execle(), execv() | سلامة الخيوط | MT-Safe
execlp(), execvp(), execvpe() | سلامة الخيوط | بيئة آمنة لتعدد الخيوط (MT-Safe)

الإصدارات
يُظهر مسار البحث المبدئي (المستخدم عندما لا تحتوي البيئة على المتغير PATH) بعض الاختلاف عبر الأنظمة. يتضمن عمومًا /bin و /usr/bin (بهذا الترتيب) وقد يتضمن أيضًا دليل العمل الحالي. في بعض الأنظمة الأخرى، يُدرج دليل العمل الحالي بعد /bin و /usr/bin، كإجراء مضاد لأحصنة طروادة. اتبع تنفيذ glibc طويلاً المبدئي التقليدي حيث يُدرج دليل العمل الحالي في بداية مسار البحث. ومع ذلك، تسبب بعض إعادة هيكلة الكود أثناء تطوير glibc 2.24 في إسقاط دليل العمل الحالي بالكامل من مسار البحث المبدئي. يُعتبر هذا التغيير السلوكي العرضي مفيدًا بشكل طفيف، ولن يُرجع.

سلوك execlp() و execvp() عند حدوث أخطاء أثناء محاولة تنفيذ الملف هو ممارسة تاريخية، ولكن لم يُوثق تقليديًا ولم يُحدد بمعيار POSIX. تقوم BSD (وربما أنظمة أخرى) بنوم آلي وإعادة محاولة إذا وُوجه ETXTBSY. يعامله Linux كخطأ صارم ويعود فورًا.

تقليديًا، تجاهلت الدوال execlp() و execvp() جميع الأخطاء باستثناء تلك الموصوفة أعلاه و ENOMEM و E2BIG، حيث كانت تعود. تعود الآن إذا حدث أي خطأ غير تلك الموصوفة أعلاه.

المعايير

environ
execl()
execlp()
execle()
execv()
execvp()
    POSIX.1-2008.

execvpe()
    GNU.

التاريخ

environ
execl()
execlp()
execle()
execv()
execvp()
    POSIX.1-2001.

execvpe()
    glibc 2.11.

العلل
قبل glibc 2.24، استخدمت execl() و execle() realloc(3) داخليًا وبالتالي لم تكن آمنة للإشارات غير المتزامنة، مخالفةً لمتطلبات POSIX.1. أُصلح هذا في glibc 2.24.

  تفاصيل خاصة بالمعمارية
على sparc و sparc64، تُوفر execv() كاستدعاء نظام من النواة (مع النموذج الموضح أعلاه) للتوافق مع SunOS. هذه الدالة ليست مستخدمة بواسطة دالة الغلاف execv() على تلك المعماريات.

انظر أيضًا
sh(1)، execve(2)، execveat(2)، fork(2)، ptrace(2)، fexecve(3)، system(3)، environ(7)

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

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

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