استدعاء نظام Exec في C.

Exec System Call C



تحتوي عائلة exec على العديد من الوظائف في C. تُستخدم وظائف C هذه بشكل أساسي لتشغيل أمر نظام في عملية منفصلة يقوم البرنامج الرئيسي بطباعة الإخراج.

في هذه المقالة ، سأتحدث عن مجموعة وظائف 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. شكرا لقراءة هذا المقال.