في هذه المقالة ، سأتحدث عن مجموعة وظائف exec وأوضح لك كيفية استخدام كل وظيفة من وظائف عائلة exec في C. لذا ، فلنبدأ.
وظائف نظام C في عائلة Exec:
يتم تحديد عائلات دالة exec في الرأس unistd.h . لذلك ، يجب عليك استخدام هذا العنوان في برنامج C حيث تريد استخدام هذه الوظائف.
فيما يلي وظائف exec المتاحة جنبًا إلى جنب مع معلمات وظيفتها:
- int execl (const char * path، const char * arg، ...، NULL) ؛
- int execlp (ملف const char * ، const char * arg ، ... ، NULL) ؛
- int execv (const char * path، char * const argv []) ؛
- int execvp (const char * file، char * const argv []) ؛
- int execle (const char * path، const char * arg، ...، NULL، char * const envp [])؛
- int execve (const char * file، char * const argv []، char * const envp []) ؛
دعونا نرى ما تفعله كل من هذه الوظائف وكيفية استخدامها.
وظيفة النظام execl ():
في execl () ، تأخذ وظيفة النظام مسار الملف الثنائي القابل للتنفيذ (أي / بن / ليرة سورية ) كالوسيطة الأولى والثانية. ثم الحجج (أي -lh و /الصفحة الرئيسية ) التي تريد تمريرها إلى الملف القابل للتنفيذ متبوعًا بـ باطل . ثم تقوم وظيفة نظام execl () بتشغيل الأمر وطباعة الإخراج. في حالة حدوث أي خطأ ، ترجع execl () -1. خلاف ذلك ، فإنه لا يعيد شيئا.
بناء الجملة:
intإكسكل(مقدار ثابت شار *طريقو مقدار ثابت شار *غاضبو...وباطل)؛فيما يلي مثال على وظيفة نظام execl ():
#يشمل
intالأساسية(فارغ) {
شار *ثنائي المسار= '/ bin / ls'؛
شار *arg1= '-lh'؛
شار *arg2= '/الصفحة الرئيسية'؛
إكسكل(ثنائي المساروثنائي المساروarg1وarg2وباطل)؛
إرجاع 0؛
}
ركضت ls -lh / المنزل الأمر باستخدام دالة النظام execl (). كما ترى ، يتم عرض النتيجة الصحيحة.
وظيفة النظام execlp ():
لا يستخدم execl () الامتداد طريق متغيرات البيئة. لذلك ، فإن المسار الكامل للملف القابل للتنفيذ مطلوب لتشغيله باستخدام execl (). يستخدم execlp () متغير البيئة PATH. لذلك ، إذا كان الملف القابل للتنفيذ أو الأمر متاحًا في PATH ، فإن الأمر أو اسم الملف كافيان لتشغيله ، فلن تكون هناك حاجة إلى المسار الكامل.
بناء الجملة:
intexeclp(مقدار ثابت شار *ملفو مقدار ثابت شار *غاضبو...وباطل)؛يمكننا إعادة كتابة مثال execl () باستخدام وظيفة نظام execlp () على النحو التالي:
#يشملintالأساسية(فارغ) {
شار *إسم البرنامج= 'ls'؛
شار *arg1= '-lh'؛
شار *arg2= '/الصفحة الرئيسية'؛
execlp(إسم البرنامجوإسم البرنامجوarg1وarg2وباطل)؛
إرجاع 0؛
}
لقد قمت فقط بتمرير اسم الأمر ls ، وليس الطريق الكامل / بن / ليرة سورية . كما ترى ، حصلت على نفس الإخراج كما كان من قبل.
وظيفة النظام execv ():
في دالة execl () ، يتم تمرير معلمات الملف القابل للتنفيذ إلى الوظيفة كوسائط مختلفة. باستخدام execv () ، يمكنك تمرير كافة المعلمات في صفيف منتهي NULL أرجف . يجب أن يكون العنصر الأول من المصفوفة هو مسار الملف القابل للتنفيذ. خلاف ذلك ، تعمل وظيفة execv () تمامًا مثل وظيفة execl ().
بناء الجملة:
intexecv(مقدار ثابت شار *طريقو شار *مقدار ثابتأرجف[])؛يمكننا إعادة كتابة مثال execl () على النحو التالي:
#يشملintالأساسية(فارغ) {
شار *ثنائي المسار= '/ bin / ls'؛
شار *أرجس[] = {ثنائي المسارو '-lh'و '/الصفحة الرئيسية'وباطل}؛
execv(ثنائي المساروأرجس)؛
إرجاع 0؛
}
كما ترى ، أحصل على الإخراج الصحيح.
وظيفة النظام execvp ():
يعمل بنفس طريقة وظيفة نظام execv (). ولكن ، يتم استخدام متغير البيئة PATH. لذلك ، فإن المسار الكامل للملف القابل للتنفيذ غير مطلوب تمامًا كما هو الحال في execlp ().
بناء الجملة:
intexecvp(مقدار ثابت شار *ملفو شار *مقدار ثابتأرجف[])؛يمكننا إعادة كتابة مثال execv () على النحو التالي:
#يشملintالأساسية(فارغ) {
شار *إسم البرنامج= 'ls'؛
شار *أرجس[] = {إسم البرنامجو '-lh'و '/الصفحة الرئيسية'وباطل}؛
execvp(إسم البرنامجوأرجس)؛
إرجاع 0؛
}
كما ترى ، يتم عرض الإخراج الصحيح.
وظيفة النظام execle ():
يعمل تمامًا مثل execl () ولكن يمكنك توفير متغيرات البيئة الخاصة بك معه. يتم تمرير متغيرات البيئة كمصفوفة بيئة . العنصر الأخير من بيئة يجب أن يكون الصفيف NULL. تحتوي جميع العناصر الأخرى على أزواج المفتاح والقيمة كسلسلة.
بناء الجملة:
intممتاز(مقدار ثابت شار *طريقو مقدار ثابت شار *غاضبو...وباطلو شار * مقدار ثابتبيئة[] )؛فيما يلي مثال على وظيفة نظام execle ():
#يشملintالأساسية(فارغ) {
شار *ثنائي المسار= '/bin/bash'؛
شار *arg1= '-c'؛
شار *arg2= 'رما - طرد - قذف 'قم بزيارة $ HOSTNAME:$ PORT من متصفحك.'؛
شار *مقدار ثابتالحسد[] = {'HOSTNAME = www.linuxhint.com'و 'المنفذ = 8080'وباطل}؛
ممتاز(ثنائي المساروثنائي المساروarg1وarg2وباطلوالحسد)؛
إرجاع 0؛
}
لقد مررت اثنين من متغيرات البيئة HOSTNAME و ميناء إلى دالة execle (). كما ترى ، يمكنني الوصول إليها من الملف القابل للتنفيذ /bin/bash .
وظيفة النظام execve ():
تمامًا مثل execle () ، يمكنك توفير متغيرات البيئة الخاصة بك جنبًا إلى جنب مع execve (). يمكنك أيضًا تمرير الوسائط كمصفوفات كما فعلت في execv ().
بناء الجملة:
intممتاز(مقدار ثابت شار *ملفو شار *مقدار ثابتأرجف[]و شار *مقدار ثابتبيئة[])؛يمكن إعادة كتابة مثال execle على النحو التالي:
#يشملintالأساسية(فارغ) {
شار *ثنائي المسار= '/bin/bash'؛
شار *مقدار ثابتأرجس[] = {ثنائي المسارو '-c'و 'رما - طرد - قذف 'قم بزيارة $ HOSTNAME:بورت $
من متصفحك.'وباطل}؛
شار *مقدار ثابتالحسد[] = {'HOSTNAME = www.linuxhint.com'و 'المنفذ = 8080'وباطل}؛
ممتاز(ثنائي المساروأرجسوالحسد)؛
إرجاع 0؛
}
كما ترى ، نحصل على نفس الإخراج كما في مثال execle ().
إذن ، هذه هي الطريقة التي تستخدم بها عائلة وظائف exec في C لبرمجة النظام في Linux. شكرا لقراءة هذا المقال.