تنفيذ (استدعاء النظام)
في مجال الحوسبة ، تُعدّ وظيفة exec إحدى وظائف نظام التشغيل التي تُشغّل ملفًا تنفيذيًا ضمن سياق عملية موجودة مسبقًا ، لتحل محل الملف التنفيذي السابق. يُشار إلى هذه العملية أيضًا باسم " التراكب" . وتكتسب أهمية خاصة في الأنظمة الشبيهة بنظام يونكس ، على الرغم من وجودها في أنظمة أخرى أيضًا. ولأنه لا يتم إنشاء عملية جديدة، فإن مُعرّف العملية (PID) لا يتغير، ولكن يتم استبدال رمز الآلة والبيانات والذاكرة الديناميكية ومكدس الذاكرة للعملية ببيانات البرنامج الجديد .
exec()يتوفر هذا الاستدعاء أو أحد أشكاله للعديد من لغات البرمجة، بما في ذلك اللغات المترجمة وبعض لغات البرمجة النصية . في مترجمات الأوامر ، يستبدل execالأمر المدمج عملية الصدفة بالبرنامج المحدد. [ 1 ]
التسمية
تختلف واجهات برمجة execالتطبيقات وتطبيقاتها. فبحسب لغة البرمجة، قد يكون الوصول إليها متاحًا عبر دالة واحدة أو أكثر ، وبحسب نظام التشغيل، قد يتم تمثيلها باستدعاء نظام واحد أو أكثر . ولهذا السبب، execتُوصف أحيانًا بأنها مجموعة من الدوال .
في لغة C ، لا توجد exec()دالة واحدة بسيطة.
توفر لغات البرمجة عالية المستوى عادةً استدعاءً واحدًا يسمى exec().
في أنظمة POSIX، وأنظمة أخرى شبيهة بنظام Unix، وأنظمة متعددة المهام أخرى
نماذج أولية للغة C
يُعرّف معيار POSIX مجموعة من الدوال في ملف الرأس unistd.h . وتُعرّف الدوال نفسها في ملف process.h لأنظمة DOS (انظر أدناه )، و OS /2 ، و Microsoft Windows .exec
int execl ( char const * path , char const * arg0 , ...); int execle ( char const * path , char const * arg0 , ..., char const * envp []); int execlp ( char const * file , char const * arg0 , ...); int execv ( char const * path , char const * argv []); int execve ( char const * path , char const * argv [], char const * envp []); int execvp ( char const * file , char const * argv []); int execvpe ( const char * file , char * const argv [], char * const envp []); int fexecve ( int fd , char * const argv [], char * const envp []);توفر بعض التطبيقات هذه الوظائف بأسماء تبدأ بشرطة سفلية (مثلاً _execl). [ 2 ]
أساس كل منها هو exec ، متبوعًا بحرف واحد أو أكثر:
- هـ - يتم تمرير متغيرات البيئة كمصفوفة من المؤشرات إلى سلاسل نصية منتهية بـ null من الشكل
name=value. يجب أن يكون العنصر الأخير من المصفوفة مؤشرًا فارغًا . [ 3 ] - l – يتم تمرير وسائط سطر الأوامر كمؤشرات فردية إلى سلاسل نصية منتهية بـ null. يجب أن يكون الوسيط الأخير مؤشرًا فارغًا.
- p – يستخدم متغير بيئة PATH للعثور على الملف المسمى في وسيطة الملف المراد تنفيذه.
- v – يتم تمرير وسائط سطر الأوامر كمصفوفة من المؤشرات إلى سلاسل نصية منتهية بـ null. يجب أن يكون العنصر الأخير في المصفوفة مؤشرًا فارغًا. [ 3 ]
- f (بادئة) – يتم تمرير مُعرّف ملف بدلاً من ذلك. يجب فتح مُعرّف الملف باستخدام O_RDONLY أو O_PATH، ويجب أن يكون لدى المُستدعي إذن بتنفيذ ملفه. [ 4 ]
في الوظائف التي لا يمكن فيها تمرير متغيرات البيئة ( execl(), execlp(), execv(), execvp())، فإن صورة العملية الجديدة ترث متغيرات البيئة الحالية.
الوسيط الأول لسطر الأوامر
غالباً ما يكون الوسيط الأول arg0هو اسم الملف التنفيذي، وقد تكون قيمته هي نفسها قيمة pathالوسيط الثاني. مع ذلك، فهذا مجرد اصطلاح، ولا يوجد ما يضمن هذا السلوك، كما أنه ليس معياراً موحداً. على سبيل المثال، في لغة جافا ، لا يكون الوسيط الأول هو مسار الملف التنفيذي، بل هو الوسيط الأول للبرنامج. [ 5 ]
الآثار
يظل مُعرِّف الملف المفتوح عند exec()إجراء الاستدعاء مفتوحًا في صورة العملية الجديدة، إلا إذا تم استدعاء fcntl() باستخدام أو فتحه باستخدام (تم تقديم الأخير في POSIX.1-2001). يُستخدم هذا الجانب لتحديد التدفقات القياسية للبرنامج الجديد.FD_CLOEXECO_CLOEXEC
يؤدي نجاح عملية التراكب إلى تدمير مساحة عناوين الذاكرة السابقة للعملية. ويستعيد نظام التشغيل جميع مناطق الذاكرة غير المشتركة . ونتيجة لذلك، تُفقد جميع البيانات التي لم تُمرر إلى البرنامج الجديد، أو لم تُحفظ بأي طريقة أخرى.
القيمة المُعادة
يؤدي استدعاء ناجح إلى استبدال صورة العملية الحالية، لذا لا يمكنه إرجاع أي شيء إلى البرنامج الذي استدعاه. تمتلك العمليات حالة خروج ، ولكن يتم جمع هذه القيمة بواسطة العملية الأصلية .
إذا فشلت المكالمة، فإن قيمة الإرجاع تكون دائمًا فارغة -1، ويتم تعيين قيمة errno إلى قيمة مناسبة. [ 6 ]
في نظام التشغيل DOS
نظام DOS ليس نظام تشغيل متعدد المهام ، لكن استبدال الصورة التنفيذية السابقة ضروري بسبب القيود الصارمة على الذاكرة الرئيسية وانعدام الذاكرة الافتراضية . تُستخدم واجهة برمجة التطبيقات نفسها لتراكب البرامج في DOS، ولها تأثيرات مشابهة لتلك الموجودة في أنظمة POSIX.
تقوم وظائف نظام MS-DOS دائمًا بتحميل البرنامج الجديد في الذاكرة كما لو أن "الحد الأقصى للتخصيص" في رأس ملفexec() البرنامج القابل للتنفيذ مُعيّن على القيمة الافتراضية 0xFFFF. يمكن استخدام أداة EXEHDR لتغيير حقل الحد الأقصى للتخصيص في البرنامج. مع ذلك، إذا تم ذلك واستُدعي البرنامج باستخدام إحدى الوظائف، فقد يتصرف البرنامج بشكل مختلف عن برنامج تم استدعاؤه مباشرةً من سطر أوامر نظام التشغيل أو باستخدام إحدى الوظائف (انظر أدناه ).exec()spawn()
في الأصداف
توفر العديد من واجهات يونكس أيضًا execأمرًا مدمجًا يستبدل عملية الواجهة بالبرنامج المحدد. [ 1 ] [ 7 ] غالبًا ما تستخدم البرامج النصية الوسيطة هذا الأمر لتشغيل برنامج (إما مباشرةً أو من خلال مترجم أو آلة افتراضية ) بعد ضبط متغيرات البيئة أو غيرها من الإعدادات. باستخدام هذا الأمر exec، لا يلزم أن تبقى الموارد التي يستخدمها برنامج الواجهة قيد الاستخدام بعد بدء تشغيل البرنامج. [ 8 ]
يمكن للأمر أيضًا إجراء عملية إعادة توجيه . في بعض أنظمة التشغيل، من الممكن استخدامه لإعادة التوجيه فقط، دون إنشاء طبقة تراكب فعلية.
في أنظمة أخرى
يتضمن نظام التشغيل OS/360 والأنظمة اللاحقة له استدعاء نظام XCTL(التحكم في النقل) يؤدي وظيفة مشابهة لوظيفة exec. [ 9 ]
تنفيذي ضد بادئ التشغيل
لا يمتلك نظام يونكس التقليدي وظيفة إنشاء عملية جديدة لتشغيل برنامج تنفيذي جديد في خطوة واحدة. قد تستخدم أنظمة أخرى الأمر spawn كأداة رئيسية لتشغيل الملفات التنفيذية، وتكون نتيجته مكافئة لتسلسل fork-exec في أنظمة يونكس. يدعم معيار POSIX إجراءات posix_spawn كإضافة اختيارية. [ 10 ]
انظر أيضاً
- تحميل السلسلة ، والتراكب في برمجة النظام
- الخروج (استدعاء النظام) ، لإنهاء عملية
- fork (استدعاء النظام) ، لإنشاء عملية جديدة (ولكن بنفس الملف التنفيذي)
- clone() ، طريقة لإنشاء سلاسل عمليات جديدة
مراجع
- 1 2 – مرجع واجهات النظام، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Group
- ↑ ويتني، تايلر. "وظائف _exec و _wexec" . learn.microsoft.com . تم الاطلاع عليه بتاريخ 26-05-2025 .
- 1 2 – مرجع واجهات النظام، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Group
- ↑ – مرجع واجهات النظام، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Group
- ↑ "جافا - مشغل تطبيقاتك - Dev.java" . Dev.java: وجهة مطوري جافا . تم الاطلاع عليه بتاريخ 26-05-2025 .
- ↑ – مرجع واجهات النظام، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Group
- ↑ شارما، ساجار (2023-05-28). "استخدام أمر exec في نصوص Bash البرمجية [ 4 أمثلة ] " . دليل لينكس . تم الاسترجاع في 2025-05-26 .
- ↑ "أغلفة سطر الأوامر" . مشروع توثيق لينكس . 10-03-2014 . تم الاطلاع عليه بتاريخ 18-02-2021 .
- ↑ "XCTL" . www.ibm.com . تم الاطلاع عليه بتاريخ 26-05-2025 .
- ↑ – مرجع واجهات النظام، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Group
- عملية (حوسبة)
- بوسيكس
- process.h
- أدوات يونكس SUS2008
- استدعاءات النظام
