.\" -*- coding: UTF-8 -*- .\" Copyright 1992, Drew Eckhardt .\" Copyright 2006, 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 execve 2 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم execve \- تنفيذ برنامج .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBint execve(const char *\fP\fIpath\fP\fB, char *const _Nullable \fP\fIargv\fP\fB[],\fP \fB char *const _Nullable \fP\fIenvp\fP\fB[]);\fP .fi .SH الوصف ينفذ \fBexecve\fP() البرنامج المشار إليه بواسطة \fIpath\fP. يتسبب هذا في استبدال البرنامج المُشغل حاليًا بواسطة العملية المستدعية ببرنامج جديد، مع مكدس، وكومة، وقطاعات بيانات (مهيأة وغير مهيأة) معاد تهيئتها. .P يجب أن يكون \fIpath\fP إما ملفًا ثنائيًا قابلًا للتنفيذ، أو نصًا برمجيًا يبدأ بسطر بالشكل: .P .in +4n .EX .SY #!\f[I]interpreter\fR [\fIoptional\-arg\fP] .YS .EE .in .P للحصول على تفاصيل الحالة الأخيرة، راجع "النصوص البرمجية للمفسر" أدناه. .P \fIargv\fP هو مصفوفة من المؤشرات إلى سلاسل تُمرر إلى البرنامج الجديد كوسائط سطر الأوامر الخاصة به. وفقًا للاتفاقية، يجب أن تحتوي أول هذه السلاسل (أي \fIargv[0]\fP) على اسم الملف المرتبط بالملف الذي يُنفذ. يجب إنهاء مصفوفة \fIargv\fP بمؤشر فارغ. (وبالتالي، في البرنامج الجديد، سيكون \fIargv[argc]\fP مؤشرًا فارغًا.) .P \fIenvp\fP هو مصفوفة من المؤشرات إلى سلاسل، تقليديًا بالشكل \fBkey=value\fP، والتي تُمرر كبيئة للبرنامج الجديد. يجب إنهاء مصفوفة \fIenvp\fP بمؤشر فارغ. .P تصف صفحة الدليل هذه استدعاء نظام Linux بالتفصيل؛ للحصول على نظرة عامة على التسمية والعديد من المتغيرات الموحدة، التي غالبًا ما تكون مفضلة، لهذه الوظيفة التي توفرها libc، بما في ذلك تلك التي تبحث في متغير البيئة \fBPATH\fP، راجع \fBexec\fP(3). .P يمكن الوصول إلى متجه الوسائط والبيئة بواسطة الدالة main للبرنامج الجديد، عندما تُعرف على النحو التالي: .P .in +4n .EX int main(int argc, char *argv[], char *envp[]) .EE .in .P لاحظ، مع ذلك، أن استخدام وسيطة ثالثة للدالة main غير محدد في POSIX.1؛ وفقًا لـ POSIX.1، يجب الوصول إلى البيئة عبر المتغير الخارجي \fBenviron\fP(7). .P لا يعيد \fBexecve\fP() القيمة عند النجاح، ويُستبدل النص، والبيانات المهيأة، والبيانات غير المهيأة (bss)، والمكدس للعملية المستدعية وفقًا لمحتويات البرنامج المحمل حديثًا. .P إذا كان البرنامج الحالي قيد التتبع (ptraced)، تُرسل إشارة \fBSIGTRAP\fP إليه بعد نجاح \fBexecve\fP(). .P إذا عُيين بت set\-user\-ID على ملف البرنامج المشار إليه بواسطة \fIpath\fP، فسيُغير معرف المستخدم الفعال للعملية المستدعية إلى معرف مالك ملف البرنامج. وبالمثل، إذا عُيين بت set\-group\-ID على ملف البرنامج، فسعُيين معرف المجموعة الفعال للعملية المستدعية إلى مجموعة ملف البرنامج. .P \fIلا\fP تُجرى التحويلات المذكورة أعلاه للمعرفات الفعالة (أي تُجاهل بتات set\-user\-ID و set\-group\-ID) إذا كان أي مما يلي صحيحًا: .IP \[bu] 3 عُيين السمة \fIno_new_privs\fP للخيط المستدعي (راجع \fBprctl\fP(2)); .IP \[bu] نظام الملفات الأساسي موصول (mounted) بـ \fInosuid\fP (علامة \fBMS_NOSUID\fP لـ \fBmount\fP(2)); أو .IP \[bu] العملية المستدعية قيد التتبع (ptraced). .P تُتجاهل أيضًا قدرات ملف البرنامج (راجع \fBcapabilities\fP(7)) إذا كان أي مما سبق صحيحًا. .P يُنسخ معرف المستخدم الفعال للعملية إلى set\-user\-ID المحفوظ؛ وبالمثل، يُنسخ معرف المجموعة الفعال إلى set\-group\-ID المحفوظ. يحدث هذا النسخ بعد أي تغييرات في المعرف الفعال تحدث بسبب بتات الوضع set\-user\-ID و set\-group\-ID. .P لا تتغير معرفات UID الحقيقية و GID الحقيقية للعملية، بالإضافة إلى معرفات مجموعاتها الإضافية، باستدعاء \fBexecve\fP(). .P إذا كان الملف القابل للتنفيذ هو ملف ثنائي a.out مرتبط ديناميكيًا يحتوي على كعب مكتبات مشتركة، يُستدعى الرابط الديناميكي للينكس \fBld.so\fP(8) في بداية التنفيذ لإحضار الكائنات المشتركة المطلوبة إلى الذاكرة وربط الملف القابل للتنفيذ بها. .P .\" إذا كان الملف القابل للتنفيذ هو ملف ELF مرتبط ديناميكيًا، يُستخدم المفسر المسمى في مقطع PT_INTERP لتحميل الكائنات المشتركة المطلوبة. هذا المفسر هو عادةً \fI/lib/ld\-linux.so.2\fP للملفات الثنائية المرتبطة بـ glibc (راجع \fBld\-linux.so\fP(8)). .SS "التأثير على سمات العملية" يُحفاظ على جميع سمات العملية أثناء \fBexecve\fP()، باستثناء ما يلي: .IP \[bu] 3 يُعاد تعيين ترتيبات أي إشارات تُلتقط إلى المبدئي (\fBsignal\fP(7)). .IP \[bu] لا يُحافظ على أي مكدس إشارة بديل (\fBsigaltstack\fP(2)). .IP \[bu] لا يُحافظ على تعيينات الذاكرة (\fBmmap\fP(2)). .IP \[bu] تُفصل مقاطع الذاكرة المشتركة System\ V المرفقة (\fBshmat\fP(2)). .IP \[bu] يُلغى تعيين مناطق الذاكرة المشتركة POSIX (\fBshm_open\fP(3)). .IP \[bu] تُغلق واصفات قائمة انتظار الرسائل POSIX المفتوحة (\fBmq_overview\fP(7)). .IP \[bu] تُغلق أي إشارات مسماة POSIX مفتوحة (\fBsem_overview\fP(7)). .IP \[bu] المؤقتات الزمنية لـ POSIX لا تُحفظ (\fBtimer_create\fP(2)). .IP \[bu] أي تيارات دليل مفتوحة تُغلق (\fBopendir\fP(3)). .IP \[bu] أقفال الذاكرة لا تُحفظ (\fBmlock\fP(2), \fBmlockall\fP(2)). .IP \[bu] معالجات الخروج لا تُحفظ (\fBatexit\fP(3), \fBon_exit\fP(3)). .IP \[bu] بيئة الفاصلة العائمة تُعاد ضبطها إلى المبدئي (انظر \fBfenv\fP(3)). .P جميع سمات العملية في القائمة السابقة محددة في POSIX.1. سمات العملية الخاصة بلينكس التالية أيضًا لا تُحفظ أثناء \fBexecve\fP(): .IP \[bu] 3 سمة "dumpable" للعملية تُضبط إلى القيمة 1، ما لم يكن برنامج set\-user\-ID أو set\-group\-ID أو برنامج ذو قدرات يُنفذ، وفي هذه الحالة قد تُعاد ضبط علامة dumpable بدلاً من ذلك إلى القيمة في \fI/proc/sys/fs/suid_dumpable\fP، في الظروف الموصوفة تحت \fBPR_SET_DUMPABLE\fP في \fBprctl\fP(2). لاحظ أن التغييرات في سمة "dumpable" قد تسبب تغيير ملكية الملفات في دليل \fI/proc/\fPpid للعملية إلى \fIroot:root\fP، كما هو موصوف في \fBproc\fP(5). .IP \[bu] علامة \fBprctl\fP(2) \fBPR_SET_KEEPCAPS\fP تُمسح. .IP \[bu] (منذ لينكس 2.4.36 / 2.6.23) إذا كان برنامج set\-user\-ID أو set\-group\-ID يُنفذ، فإن إشارة موت الأب المضبوطة بواسطة علامة \fBprctl\fP(2) \fBPR_SET_PDEATHSIG\fP تُمسح. .IP \[bu] اسم العملية، كما ضُبط بواسطة \fBprctl\fP(2) \fBPR_SET_NAME\fP (ويُعرض بواسطة \fIps\ \-o comm\fP)، يُعاد ضبطه إلى اسم الملف القابل للتنفيذ الجديد. .IP \[bu] علامة \fBSECBIT_KEEP_CAPS\fP \fIsecurebits\fP تُمسح. انظر \fBcapabilities\fP(7). .IP \[bu] إشارة الإنهاء تُعاد ضبطها إلى \fBSIGCHLD\fP (انظر \fBclone\fP(2)). .IP \[bu] جدول واصف الملف يُلغى مشاركته، مما يلغي تأثير علامة \fBCLONE_FILES\fP لـ \fBclone\fP(2). .P لاحظ النقاط الإضافية التالية: .IP \[bu] 3 جميع الخيوط غير الخيط المستدعي تُدمر أثناء \fBexecve\fP(). كائنات المزامنة ومتغيرات الشرط وكائنات pthreads الأخرى لا تُحفظ. .IP \[bu] ما يعادل \fIsetlocale(LC_ALL,\ \[dq]C\[dq])\fP يُنفذ عند بدء تشغيل البرنامج. .IP \[bu] يحدد POSIX.1 أن ترتيبات أي إشارات تُهمل أو تُضبط إلى المبدئي تُترك دون تغيير. يحدد POSIX.1 استثناءً واحدًا: إذا كانت \fBSIGCHLD\fP تُهمل، فقد يترك التنفيذ الترتيب دون تغيير أو يعيد ضبطه إلى المبدئي؛ لينكس يفعل الأول. .IP \[bu] أي عمليات إدخال/إخراج غير متزامنة معلقة تُلغى (\fBaio_read\fP(3), \fBaio_write\fP(3)). .IP \[bu] لمعالجة القدرات أثناء \fBexecve\fP()، انظر \fBcapabilities\fP(7). .IP \[bu] .\" On Linux it appears that these file descriptors are .\" always open after an execve(), and it looks like .\" Solaris 8 and FreeBSD 6.1 are the same. -- mtk, 30 Apr 2007 بشكل مبدئي، تبقى واصفات الملفات مفتوحة عبر \fBexecve\fP(). واصفات الملفات الموسومة بـ close\-on\-exec تُغلق؛ انظر وصف \fBFD_CLOEXEC\fP في \fBfcntl\fP(2). (إذا أُغلق واصف ملف، سيؤدي ذلك إلى تحرير جميع أقفال السجلات التي حصلت عليها هذه العملية على الملف الأساسي. انظر \fBfcntl\fP(2) للتفاصيل.) يقول POSIX.1 أنه إذا كانت واصفات الملفات 0 و1 و2 ستُغلق لولا ذلك بعد \fBexecve\fP() ناجح، وستكتسب العملية امتيازًا لأن بت وضع set\-user\-ID أو set\-group\-ID ضُبط على الملف المنفذ، فقد يفتح النظام ملفًا غير محدد لكل من واصفات الملفات هذه. كمبدأ عام، لا يمكن لأي برنامج محمول، سواء كان مميزًا أم لا، أن يفترض أن واصفات الملفات الثلاثة هذه ستبقى مغلقة عبر \fBexecve\fP(). .SS "نصوص المفسر" نص المفسر هو ملف نصي لديه إذن تنفيذ مفعل وسطره الأول من الشكل: .P .in +4n .SY #!\f[I]interpreter\fR [\fIoptional\-arg\fP] .YS .in .P يجب أن يكون \fIinterpreter\fP مسارًا صالحًا لملف قابل للتنفيذ. .P سيُستدعى \fIinterpreter\fP بالوسائط التالية: .P .in +4n .SY \f[I]interpreter\fR [\fIoptional\-arg\fP] \fIpath\fP \fIarg\fP... .YS .in .P .\" See the P - preserve-argv[0] option. .\" Documentation/admin-guide/binfmt-misc.rst .\" https://www.kernel.org/doc/html/latest/admin-guide/binfmt-misc.html حيث \fIarg...\fP هي سلسلة الكلمات المشار إليها بواسطة وسيطة \fIargv\fP لـ \fBexecve\fP()، بدءًا من \fIargv[1]\fP. لاحظ أنه لا توجد طريقة للحصول على \fIargv[0]\fP الذي مُرر إلى استدعاء \fBexecve\fP(). .P للاستخدام المحمول، يجب أن يكون \fIoptional\-arg\fP إما غائبًا، أو محددًا ككلمة واحدة (أي لا يجب أن يحتوي على مسافة بيضاء)؛ انظر الإصدارات أدناه. .P .\" commit bf2a9a39639b8b51377905397a5005f444e9a892 منذ لينكس 2.6.28، يسمح النواة لمفسر النص أن يكون هو نفسه نصًا. هذا الإذن متكرر، حتى حد أربع تكرارات، بحيث يمكن أن يكون المفسر نصًا يُفسر بواسطة نص، وهكذا. .SS "حدود حجم الوسائط والبيئة" تفرض معظم تطبيقات UNIX حدًا ما على الحجم الإجمالي لسلاسل وسائط سطر الأوامر (\fIargv\fP) والبيئة (\fIenvp\fP) التي قد تُمرر إلى برنامج جديد. يسمح POSIX.1 للتنفيذ بالإعلان عن هذا الحد باستخدام الثابت \fBARG_MAX\fP (إما معرف في \fI\fP أو متاح في وقت التشغيل باستخدام الاستدعاء \fIsysconf(_SC_ARG_MAX)\fP). .P قبل لينكس 2.6.23، كانت الذاكرة المستخدمة لتخزين سلاسل البيئة والوسائط محدودة بـ 32 صفحة (محددة بواسطة ثابت النواة \fBMAX_ARG_PAGES\fP). على معماريات بحجم صفحة 4 كيلوبايت، ينتج عن هذا حجم أقصى قدره 128\ كيلوبايت. .P .\" For some background on the changes to ARG_MAX in Linux 2.6.23 and .\" Linux 2.6.25, see: .\" http://sourceware.org/bugzilla/show_bug.cgi?id=5786 .\" http://bugzilla.kernel.org/show_bug.cgi?id=10095 .\" http://thread.gmane.org/gmane.linux.kernel/646709/focus=648101, .\" checked into Linux 2.6.25 as commit a64e715fc74b1a7dcc5944f848acc38b2c4d4ee2. .\" Ollie: That doesn't include the lists of pointers, though, .\" so the actual usage is a bit higher (1 pointer per argument). على لينكس 2.6.23 والإصدارات الأحدث، تدعم معظم المعماريات حدًا للحجم مشتقًا من حد المورد الناعم \fBRLIMIT_STACK\fP (انظر \fBgetrlimit\fP(2)) الساري في وقت استدعاء \fBexecve\fP(). (تُستثنى المعماريات التي لا تحتوي على وحدة إدارة ذاكرة: فهي تحافظ على الحد الذي كان ساريًا قبل لينكس 2.6.23.) يسمح هذا التغيير للبرامج بالحصول على قائمة وسائط و/أو بيئة أكبر بكثير. بالنسبة لهذه المعماريات، يُحد الحجم الإجمالي إلى 1/4 من حجم المكدس المسموح به. (فرض حد 1/4 يضمن أن البرنامج الجديد لديه دائمًا بعض مساحة المكدس.) بالإضافة إلى ذلك، يُحد الحجم الإجمالي إلى 3/4 من قيمة ثابت النواة \fB_STK_LIM\fP (8 ميجابايت). منذ لينكس 2.6.25، تضع النواة أيضًا حدًا أدنى قدره 32 صفحة على هذا الحد الحجمي، بحيث، حتى عندما يُضبط \fBRLIMIT_STACK\fP منخفضًا جدًا، تُضمن التطبيقات الحصول على مساحة وسائط وبيئة على الأقل بقدر ما وفرته لينكس 2.6.22 والإصدارات الأقدم. (لم يُقدم هذا الضمان في لينكس 2.6.23 و2.6.24.) بالإضافة إلى ذلك، الحد لكل سلسلة هو 32 صفحة (ثابت النواة \fBMAX_ARG_STRLEN\fP)، والحد الأقصى لعدد السلاسل هو 0x7FFFFFFF. .SH "قيمة الإرجاع" عند النجاح، لا ترجع \fBexecve\fP() أي قيمة، وعند الخطأ تُرجع \-1، ويُضبط \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBE2BIG\fP إجمالي عدد البايتات في البيئة (\fIenvp\fP) وقائمة الوسائط (\fIargv\fP) كبير جدًا، أو وسيط أو سلسلة بيئة طويلة جدًا، أو المسار الكامل \fIpath\fP للملف القابل للتنفيذ طويل جدًا. يُحتسب البايت الصفري الختامي كجزء من طول السلسلة. .TP \fBEACCES\fP يُرفض إذن البحث على مكون من بادئة المسار لـ \fIpath\fP أو اسم مفسر النص البرمجي. (انظر أيضًا \fBpath_resolution\fP(7).) .TP \fBEACCES\fP الملف أو مفسر النص البرمجي ليس ملفًا عاديًا. .TP \fBEACCES\fP يُرفض إذن التنفيذ للملف أو النص البرمجي أو مفسر ELF. .TP \fBEACCES\fP نظام الملفات موصول بخيار \fInoexec\fP. .TP \fBEAGAIN\fP (منذ لينكس 3.1) .\" commit 72fa59970f8698023045ab0713d66f3f4f96945c بعد تغيير UID الحقيقي باستخدام إحدى استدعاءات \fBset*uid\fP()، كان المتصل\[em]ولا يزال\[em]فوق حد موارده \fBRLIMIT_NPROC\fP (انظر \fBsetrlimit\fP(2)). للحصول على شرح أكثر تفصيلاً لهذا الخطأ، انظر الملاحظات. .TP \fBEFAULT\fP يشير \fIpath\fP أو أحد المؤشرات في المتجهات \fIargv\fP أو \fIenvp\fP إلى خارج مساحة العنوان القابلة للوصول. .TP \fBEINVAL\fP يحتوي ملف ELF قابل للتنفيذ على أكثر من مقطع PT_INTERP واحد (أي حاول تسمية أكثر من مفسر واحد). .TP \fBEIO\fP حدث خطأ إدخال/إخراج. .TP \fBEISDIR\fP كان مفسر ELF دليلاً. .TP \fBELIBBAD\fP لم يكن مفسر ELF بتنسيق معروف. .TP \fBELOOP\fP تمت مصادفة عدد كبير جدًا من الروابط الرمزية أثناء حل \fIpath\fP أو اسم نص برمجي أو مفسر ELF. .TP \fBELOOP\fP .\" commit d740269867021faf4ce38a449353d2b986c34a67 وصلَ إلى حد التكرار الأقصى أثناء تفسير النص البرمجي التكراري (انظر "النصوص البرمجية المفسرة"، أعلاه). قبل لينكس 3.8، كان الخطأ الناتج لهذه الحالة هو \fBENOEXEC\fP. .TP \fBEMFILE\fP وُصل إلى الحد الأقصى لواصفات الملفات المفتوحة لكل عملية. .TP \fBENAMETOOLONG\fP المسار \fIpath\fP طويل جداً. .TP \fBENFILE\fP وُصل إلى الحد الأقصى لإجمالي عدد الملفات المفتوحة على مستوى النظام. .TP \fBENOENT\fP \fIpath\fP أو نص برمجي أو مفسر ELF غير موجود. .TP \fBENOEXEC\fP الملف القابل للتنفيذ ليس بتنسيق معروف، أو مخصص لبنية خاطئة، أو به خطأ تنسيق آخر يعني أنه لا يمكن تنفيذه. .TP \fBENOMEM\fP ذاكرة النواة المتوفرة غير كافية. .TP \fBENOTDIR\fP مكون من بادئة المسار لـ \fIpath\fP أو نص برمجي أو مفسر ELF ليس دليلاً. .TP \fBEPERM\fP نظام الملفات موصول بخيار \fInosuid\fP، والمستخدم ليس المستخدم الفائق، والملف يحتوي على بت set\-user\-ID أو set\-group\-ID مضبوطًا. .TP \fBEPERM\fP العملية قيد التتبع، والمستخدم ليس المستخدم الفائق، والملف يحتوي على بت set\-user\-ID أو set\-group\-ID مضبوطًا. .TP \fBEPERM\fP تطبيقات "capability\-dumb" لن تحصل على المجموعة الكاملة من الصلاحيات المسموح بها الممنوحة بواسطة الملف القابل للتنفيذ. انظر \fBcapabilities\fP(7). .TP \fBETXTBSY\fP الملف القابل للتنفيذ المحدد كان مفتوحًا للكتابة بواسطة عملية واحدة أو أكثر. .SH الإصدارات لا يوثق POSIX سلوك #!، لكنه موجود (مع بعض الاختلافات) على أنظمة UNIX الأخرى. .P .\" e.g., EFAULT on Solaris 8 and FreeBSD 6.1; but .\" HP-UX 11 is like Linux -- mtk, Apr 2007 .\" Bug filed 30 Apr 2007: http://bugzilla.kernel.org/show_bug.cgi?id=8408 .\" Bug rejected (because fix would constitute an ABI change). .\" على لينكس، يمكن تحديد \fIargv\fP و \fIenvp\fP كـ NULL. في كلتا الحالتين، هذا له نفس تأثير تحديد الوسيطة كمؤشر لقائمة تحتوي على مؤشر صفري واحد. \fBلا تستغل هذه الميزة غير القياسية وغير القابلة للنقل!\fP على العديد من أنظمة UNIX الأخرى، سيؤدي تحديد \fIargv\fP كـ NULL إلى خطأ (\fBEFAULT\fP). تعالج \fIبعض\fP أنظمة UNIX الأخرى حالة \fIenvp==NULL\fP مثل لينكس. .P .\" ينص POSIX.1 على أن القيم التي ترجعها \fBsysconf\fP(3) يجب أن تكون ثابتة طوال عمر العملية. ومع ذلك، منذ لينكس 2.6.23، إذا تغير حد المورد \fBRLIMIT_STACK\fP، فإن القيمة المبلغ عنها بواسطة \fB_SC_ARG_MAX\fP ستتغير أيضًا، لتعكس حقيقة أن الحد الأقصى للمساحة لحفظ وسائط سطر الأوامر ومتغيرات البيئة قد تغير. .SS "نصوص المفسر" .\" commit 6eb3c3d0a52dca337e327ae8868ca1f44a712e02 يفرض النواة حدًا أقصى للطول على النص الذي يتبع الأحرف "#!" في بداية النص البرمجي؛ تُتجاهل الأحرف التي تتجاوز الحد. قبل لينكس 5.1، الحد هو 127 حرفًا. منذ لينكس 5.1، الحد هو 255 حرفًا. .P .\" e.g., Solaris 8 .\" e.g., FreeBSD before 6.0, but not FreeBSD 6.0 onward تختلف دلالات وسيطة \fIoptional\-arg\fP للنص البرمجي المفسر عبر التطبيقات. على لينكس، تُمرر السلسلة الكاملة التي تلي اسم \fIinterpreter\fP كوسيطة واحدة إلى المفسر، ويمكن أن تتضمن هذه السلسلة مسافات بيضاء. ومع ذلك، يختلف السلوك على بعض الأنظمة الأخرى. تستخدم بعض الأنظمة المسافة البيضاء الأولى لإنهاء \fIoptional\-arg\fP. على بعض الأنظمة، يمكن أن يحتوي النص البرمجي المفسر على وسائط متعددة، وتُستخدم المسافات البيضاء في \fIoptional\-arg\fP لفصل الوسائط. .P يتجاهل لينكس (مثل معظم أنظمة UNIX الحديثة الأخرى) بتات set\-user\-ID و set\-group\-ID على النصوص البرمجية. .SH المعايير POSIX.1\-2024. .SH التاريخ .\" SVr4 documents additional error .\" conditions EAGAIN, EINTR, ELIBACC, ENOLINK, EMULTIHOP; POSIX does not .\" document ETXTBSY, EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL, .\" EISDIR or ELIBBAD error conditions. 4.3BSD، SVr4، POSIX.1\-1988. .P مع UNIX\ V6، كانت قائمة وسائط استدعاء \fBexec\fP() تنتهي بـ 0، بينما كانت قائمة وسائط \fImain\fP تنتهي بـ \-1. وبالتالي، لم تكن قائمة الوسائط هذه قابلة للاستخدام مباشرة في استدعاء \fBexec\fP() آخر. منذ UNIX\ V7، كلاهما NULL. .SH ملاحظات يرى المرء أحيانًا \fBexecve\fP() (والدوال ذات الصلة الموصوفة في \fBexec\fP(3)) موصوفة بأنها "تنفذ عملية \fIجديدة\fP" (أو ما شابه). هذا وصف مضلل للغاية: لا توجد عملية جديدة؛ تظل العديد من سمات العملية المستدعية دون تغيير (على وجه الخصوص، PID الخاص بها). كل ما تفعله \fBexecve\fP() هو ترتيب لعملية موجودة (العملية المستدعية) لتنفيذ برنامج جديد. .P لا يمكن تتبع العمليات ذات set\-user\-ID و set\-group\-ID باستخدام \fBptrace\fP(2). .P تختلف نتيجة وصل نظام ملفات \fInosuid\fP عبر إصدارات نواة لينكس: بعضها سيرفض تنفيذ البرامج القابلة للتنفيذ ذات معرف المستخدم المحدد ومعرف المجموعة المحدد عندما يمنح ذلك المستخدم صلاحيات لم تكن لديه مسبقًا (وتعيد \fBEPERM\fP)، وبعضها سيتجاهل بتات معرف المستخدم المحدد ومعرف المجموعة المحدد وينفذ \fBexec\fP() بنجاح. .P .\" commit 19d860a140beac48a1377f179e693abe86a9dac9 في معظم حالات فشل \fBexecve\fP()، تعود السيطرة إلى صورة البرنامج القابلة للتنفيذ الأصلية، ويمكن لمستدعي \fBexecve\fP() معالجة الخطأ. ومع ذلك، في حالات (نادرة) (تحدث عادةً بسبب استنزاف الموارد)، قد يحدث الفشل بعد نقطة اللاعودة: تُفكك صورة البرنامج القابلة للتنفيذ الأصلية، لكن لم يمكن بناء الصورة الجديدة بالكامل. في مثل هذه الحالات، تقتل النواة العملية بإشارة \fBSIGSEGV\fP (\fBSIGKILL\fP حتى لينكس 3.17). .SS "execve() و EAGAIN" فيما يلي شرح أكثر تفصيلاً لخطأ \fBEAGAIN\fP الذي يمكن أن يحدث (منذ لينكس 3.1) عند استدعاء \fBexecve\fP(). .P .\" commit 909cc4ae86f3380152a18e2a3c44523893ee11c4 يمكن أن يحدث خطأ \fBEAGAIN\fP عندما تسبب استدعاء \fIسابق\fP لـ \fBsetuid\fP(2) أو \fBsetreuid\fP(2) أو \fBsetresuid\fP(2) في تغيير معرف المستخدم الحقيقي للعملية، وتسبب هذا التغيير في تجاوز العملية لحد مواردها \fBRLIMIT_NPROC\fP (أي أن عدد العمليات التابعة لمعرف المستخدم الحقيقي الجديد يتجاوز حد المورد). من لينكس 2.6.0 إلى لينكس 3.0، تسبب هذا في فشل استدعاء \fBset*uid\fP(). (قبل لينكس 2.6، لم يُفرض حد المورد على العمليات التي غيرت معرفات المستخدمين الخاصة بها.) .P منذ لينكس 3.1، لم يعد السيناريو الموصوف للتو يتسبب في فشل استدعاء \fBset*uid\fP()، لأنه أدى في كثير من الأحيان إلى ثغرات أمنية حيث لم تتحقق التطبيقات المعيبة من حالة الإرجاع وافترضت أن\[em]إذا كان لدى المستدعي صلاحيات الجذر\[em]فإن الاستدعاء سينجح دائمًا. بدلاً من ذلك، تقوم استدعاءات \fBset*uid\fP() الآن بتغيير معرف المستخدم الحقيقي بنجاح، لكن النواة تضع علامة داخلية، تسمى \fBPF_NPROC_EXCEEDED\fP، للإشارة إلى أنه تُجوز حد المورد \fBRLIMIT_NPROC\fP. إذا عُيين علامة \fBPF_NPROC_EXCEEDED\fP وكان حد المورد لا يزال متجاوزًا في وقت استدعاء \fBexecve\fP() لاحق، فإن هذا الاستدعاء يفشل مع الخطأ \fBEAGAIN\fP. يضمن منطق النواة هذا أن حد المورد \fBRLIMIT_NPROC\fP لا يزال مفروضًا على سير عمل الخفي المميز الشائع\[em]أي \fBfork\fP(2) + \fBset*uid\fP() + \fBexecve\fP(). .P .\" .\" .SH BUGS .\" Some Linux versions have failed to check permissions on ELF .\" interpreters. This is a security hole, because it allows users to .\" open any file, such as a rewinding tape device, for reading. Some .\" Linux versions have also had other security holes in .\" .BR execve () .\" that could be exploited for denial of service by a suitably crafted .\" ELF binary. There are no known problems with Linux 2.0.34 or Linux 2.2.15. إذا لم يكن حد المورد لا يزال متجاوزًا في وقت استدعاء \fBexecve\fP() (لأن عمليات أخرى تابعة لمعرف المستخدم الحقيقي هذا أنهت بين استدعاء \fBset*uid\fP() واستدعاء \fBexecve\fP())، فإن استدعاء \fBexecve\fP() ينجح وتقوم النواة بمسح علامة العملية \fBPF_NPROC_EXCEEDED\fP. تُمسح أيضًا العلامة إذا نجح استدعاء لاحق لـ \fBfork\fP(2) بواسطة هذه العملية. .SH أمثلة البرنامج التالي مصمم ليُنفذ بواسطة البرنامج الثاني أدناه. إنه فقط يردد وسائط سطر الأوامر الخاصة به، واحدًا لكل سطر. .P .in +4n .\" SRC BEGIN (myecho.c) .EX /* myecho.c */ \& #include #include \& int main(int argc, char *argv[]) { for (size_t j = 0; j < argc; j++) printf("argv[%zu]: %s\[rs]n", j, argv[j]); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .in .P يمكن استخدام هذا البرنامج لتنفيذ البرنامج المسمى في وسيطة سطر الأوامر الخاصة به: .P .in +4n .\" SRC BEGIN (execve.c) .EX /* execve.c */ \& #include #include #include \& int main(int argc, char *argv[]) { static char *newargv[] = { NULL, "hello", "world", NULL }; static char *newenviron[] = { NULL }; \& if (argc != 2) { fprintf(stderr, "Usage: %s \[rs]n", argv[0]); exit(EXIT_FAILURE); } \& newargv[0] = argv[1]; \& execve(argv[1], newargv, newenviron); perror("execve"); /* execve() returns only on error */ exit(EXIT_FAILURE); } .EE .\" SRC END .in .P يمكننا استخدام البرنامج الثاني لتنفيذ الأول كما يلي: .P .in +4n .EX $\fB cc myecho.c \-o myecho\fP $\fB cc execve.c \-o execve\fP $\fB ./execve ./myecho\fP argv[0]: ./myecho argv[1]: hello argv[2]: world .EE .in .P يمكننا أيضًا استخدام هذه البرامج لتوضيح استخدام مفسر النص البرمجي. للقيام بذلك، نقوم بإنشاء نص برمجي يكون "مفسره" هو برنامجنا \fImyecho\fP: .P .in +4n .EX $\fB cat > script\fP \fB#!./myecho script\-arg\fP \fB\[ha]D\fP $\fB chmod +x script\fP .EE .in .P يمكننا بعد ذلك استخدام برنامجنا لتنفيذ النص البرمجي: .P .in +4n .EX $\fB ./execve ./script\fP argv[0]: ./myecho argv[1]: script\-arg argv[2]: ./script argv[3]: hello argv[4]: world .EE .in .SH "انظر أيضًا" \fBchmod\fP(2), \fBexecveat\fP(2), \fBfork\fP(2), \fBget_robust_list\fP(2), \fBptrace\fP(2), \fBexec\fP(3), \fBfexecve\fP(3), \fBgetauxval\fP(3), \fBgetopt\fP(3), \fBsystem\fP(3), \fBcapabilities\fP(7), \fBcredentials\fP(7), \fBenviron\fP(7), \fBpath_resolution\fP(7), \fBld.so\fP(8) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .