الترميز بالشوكة و exec بالقدوة في ج

Coding With Fork Exec Example C



يحتوي عنوان مقالتنا على وظيفتين مختلفتين للغة C والتي تحدث أثناء تشغيل أي برنامج في نظامنا. لسوء الحظ ، لا توجد إمكانية لحدوث أكثر من برنامج واحد في وقت واحد في C. يمكن أن تحدث مهمة واحدة فقط في وقت معين ، مما يعني أنها لا تسمح بتشغيل البرامج المتزامنة. يتسبب في انتظار اكتمال إحدى العمليات لتنفيذ العملية الأخرى. لتجنب مشكلة استكشاف الأخطاء وإصلاحها ، قد تحتاج إلى تطوير برنامجك بطريقة جيدة ، كونك مطورًا جيدًا. يستخدم Linux fork () للتغلب على الانتظار والسماح بالتزامن في نظامك. يساعد في تكرار عملية جديدة وإنشاء عملية جديدة عن طريق استدعاء العملية المكررة. العملية الجديدة هي العملية الفرعية ، وتسمى العملية السابقة العملية الأم.

حيث يتم استخدام وظيفة exec () لتغيير البرنامج الحالي الحالي بالبرنامج الجديد. يتم هذا الاستبدال عن طريق إجراء تعديلات على محتوى برنامج أو ملف. لذا فإن الاختلاف بين fork و exec هو أن fork ينشئ عملية جديدة من العملية الحالية ، ويتم استخدام exec لاستبدال البرنامج الحالي عن طريق إنشاء واحد جديد.







المتطلبات الأساسية

لتنفيذ أي برنامج c على نظام Linux الخاص بك ، نحتاج إلى تثبيت بعض المتطلبات الأساسية عليه. انتقل إلى المحطة باستخدام طريقة الاختصار Ctrl + Alt + T. اكتب الآن الأوامر التالية لتثبيت صفحات الرجل.



$سودوملائمتثبيتmanpages- ديف



سيتم تثبيت جميع الصفحات المقابلة.





من الآن فصاعدًا ، لتشغيل برنامج على Linux ، تحتاج إلى تثبيت برنامج التحويل البرمجي للكود. يستخدم لتجميع الكود وتنفيذه. لهذا الغرض ، سنقوم بتثبيت مستودعات دول مجلس التعاون الخليجي في نظامنا.

$سودوملائمتثبيتمجلس التعاون الخليجي



الترميز مع exec في c

نظرًا لأننا قمنا بتثبيت صفحات man في Linux ، فسوف نستخدم الأمر التالي لمعرفة الوصف المتعلق بـ exec. الصيغة الأولية للعينة هي كما يلي:

بناء الجملة

إكسيك(اسم المسار/ملف، argv)؛

هنا استخدمنا رأس unistd.h لأنه يحتوي على جميع معلومات عائلات وظيفة exec.

$رجل إكسيك

الآن في الصورة المذكورة أعلاه ، يمكنك ملاحظة أنواع exec. هذه هي عائلة وظائف exec. كل واحد هو لوظيفة مختلفة تتبع نفس القاعدة ، exec.

مثال: الآن ، انتقل إلى أبعد من ذلك ، سنصف وظيفة exec بمساعدة مثال. سنأخذ وظيفة واحدة من exec لإثبات عملها ، وهو execv. أولاً ، سننشئ ملفين بامتداد .c. بعد إنشائها ، سنكتب الرموز الخاصة بها وننفذها لمعرفة النتيجة.

ضع في اعتبارك اسم ملف sample4.c. يرجى فتحه واستخدام الكود التالي. في هذا الكود ، استخدمنا execv بطريقة معينة مذكورة أدناه.

إكسيكف(./sample4copy ، args)؛

يحتوي الجزء الأول على مسار الدليل الجديد ، ويعرض الجزء الثاني مصفوفة الوسائط كمعامل مررنا.

نموذج 4. ج

بادئ ذي بدء ، قمنا بطباعة معرف العملية الحالية. ثانيًا ، لقد أنشأنا مصفوفة أحرف لها NULL في النهاية للإنهاء. ثالثًا ، أطلقنا على وظيفة sample4copy.

Sample4copy.c

عندما نستدعي وظيفة exec () ، يتم تغيير صورة العملية. تُظهر الصورة المذكورة أدناه رمز sample4copy.c.

استخدمنا هنا تعليمات print فقط للحصول على معرف العملية الحالية.

يمكن الحصول على إخراج الرموز الخاصة باستخدام الأوامر التالية.

دوالر دول مجلس التعاون الخليجي - عينة 4 sample4.c
GCC –o sample4copy sample4copy.c
$./عينة 4

كما أوضحنا سابقًا ، تُستخدم كلمة GCC لتجميع الكود ، وبعد التجميع ، يتم تنفيذ الكود بنجاح.

وفقًا للصورة ، يتم عرض معرف المنتج للملف sample4.c أولاً كما تم الإعلان عنه قبل استدعاء exec. ثم بعد استدعاء الدالة exec () ، يتم تنفيذ كل من عبارات الطباعة الخاصة بالملف sample4copy.c حيث يتم استخدام getpid () للحصول على معرف العملية.

الترميز بالشوكة في ج

تُنشئ وظيفة fork () العملية الفرعية من العملية الأصلية. يحتوي أيضًا على رأسين ، بما في ذلك معلومات التفرع الموجودة فيه.

بناء الجملة:

شوكة Pid_t(فارغ)؛

يمكننا استخدام صفحة الدليل للمساعدة في الاستخدام

$رجلشوكة

مثال: الآن فكر في مثال عن طريق إنشاء ملف sample3.c. سنقوم بإدخال الكود داخل الملف. وفقًا للكود ، قمنا بتعيين حالة الشوكة على أنها متشعبة.

Sample3.c

لقد استخدمنا عبارة if-else لتطبيق الشرط. يتم الإعلان عن أوامر الطباعة البسيطة هنا للمساعدة في فهم مفهوم fork (). تم التصريح عن Forkrank أولاً على أنه 0 ثم -1. باستخدام fork () ، توجد الآن عمليتان تعملان بشكل متزامن. يمكن الحصول على المخرجات باستخدام نفس الكود ، كما هو مستخدم أعلاه في مثال exec.

دول مجلس التعاون الخليجي $ –o sample3.c
$./عينة 3

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

يدعو نظام Fork و Exec بشكل جماعي

هنا سنأخذ ملفين باسم sample1.c و sample2.c. أولاً ، افتح الملف sampl1.c واكتب الكود المرفق أدناه في الصورة. لقد استخدمنا استدعاء نظام fork () هنا ؛ عند إنشاء العملية الفرعية ، سيتم تعيين p بالرقم 0. أثناء استخدام استدعاء نظام exec ، سيتم استبدال sample1.c بـ sample2.c.

Sample1.c

نموذج 2. ج

على غرار الأمثلة التي تمت مناقشتها أعلاه ، سيحتوي ملف العينة 2 على عبارات printf فيه. في sample1.c ، يتم تنفيذ أمر الطباعة الأول أولاً ، ثم يتم استدعاء وظيفة fork ، عندما يتم تنفيذ p == 0 ، ثم يتم تنفيذ الجزء الفرعي وسيتم تشغيل ملف sample2.c. سيحتوي الإخراج على GCC لتجميع كلا الملفين. هنا الأصل sample1.c id و sample2.c id مختلف لأنهما أب وابن.

استنتاج

في هذه المقالة ، استخدمنا كل من fork و exec بشكل منفصل وجماعي لفهم الاستخدام والمفهوم بسهولة. آمل أن يحتوي هذا البرنامج التعليمي على محتوى كافٍ سيؤدي إلى الوصول إلى زيادة معرفتك.