السلام عليكم ورحمة الله وبركاته
إن شاء الله تكونوا في تمام الصحة والعافية إخواني
أولا عبرت على مصطلح system call fork بالدالة fork
نفس الشيء مع system call execvp
*)عندما يكون برنامج في طور التشغيل يسمى
process.
عند إنشاء
process يكون لها رقم يسمى
PID .
مثال نضغط
ps على الشيل ونشوف قائمة ال
process:
كل
process لديها
process أب التي قامت بإنشائها .
*)رقم بروسس الأب إسمه
PPID *)كل بروسس لديها بروسس أب واحدة فقط .
*) مثلما لدينا في الصورة السابقة :
آلبروسس
10575هي بروسس الأب للبروسس
10636 *)كل بروسس لديها أب واحد وهذا الأب بإمكانه إنشاء العديد من البروسس إسمهم
بروسس الأبناء يعني عبارة لدينا شجرة بروسسات .
الدالة ()fork [PHP]
#include
int k = fork () ;
[/PHP]
إستدعاء الدالة
()fork تنشى نسخة أخرى من بروسس البرنامج .
وبعد إستدعاء ()fork يتواصل تنفيذ الإثنين بروسس بصفة مستمرة .
يكمن الإختلاف الوحيد في القيمة التي ترجعها الدالة ()fork.
فإذا أرجعت لنا الدالة ()fork القيمة
0 فهذا يعني أننا في وسط بروسس الإبن .
وإذا أرجعت لنا الدالة () fork قيمة
أكبر من 0 فهذا يعنني أننا في وسط بروسس الأب وهذه القيمة هي رقم بروسس الإبن (PID).
وإذا أرجعت لنا الدالة () fork القيمة
-1 فهذا يعنني أن عملية إستنساخ البروسس قد فشلت .
وذلك يعود لأحد الأسباب التالية :
إما أنه لم يعد هناك مساحة في الذاكرة أو أن المستخدم أنشأ العديد من البروسوسات .
وهذه صورة توضحية للعملية :
الدالة () getpid و الدالة ()getppid الدالة
() getpidترجع لنا رقم PID البروسس المنادية للدالة ()getpid
الدالة () getppid ترجع لنا رقم PID أب البروسس .
نشوف الكود التالي :
[PHP]
#include // fork لإستعمال
#include // printf لإستعمال
int a=1;
int main(int argc, char *argv)
{
int k;
switch(k = fork())
{
case -1 : /* فشل عملية إستنساخ البروسس */
break ;
case 0 : /* فقط بروسس الإبن من تنفذ هذه التعليمة */
printf("I'm the child process and my PID is : %d \n\n" , getpid());
a += 10 ;
break;
default : /* فقط بروسس الأب من تنفذ هذه التعليمة */
printf("We are inside the parent process with PID : %d \n\n" , getpid());
a += 100;
}
// بروسس الأب وبروسس الإبن ينفذان التالي :
printf (" process finished with a = %d\n" , getpid(),a);
return 0;
}
[/PHP]
الناتج مبين في الصورة التالية :
يعني الدالة () fork تسمح لنا بإنشاء بروسس وبحيث بروسس الأب وبروسس الإبن يكون لديهم نفس الكود (binary ) ولكن لكل منهما مساحته الخاصة في الذاكرة
الدالة exec *)عندما نكتب كومند على الشيل يقوم الشيل بإنشاء بروسس لتنفيذ هذه الكومند .
ثم ينتظر إنتهاء البروسس ليطلب كومند أخرى .
طيب يعني فوحدة من هاتان البروسس هي إبن الأخرى .
*)وطبعا لن تكون هناك فائدة من وجود نسختان لنفس البرنامج يشتغلان في النظام في نفس الوقت .
*)لذلك فإن بعد عملية الإستنساخ فالإبن حيقوم بإستبدال البرنامج وذلك بإستعمال الدالة
()exec.
*)هذه الدالة تحافظ على هوية البروسس ولكنها تستبدل الكود التنفيذي وبياناتها ببيانات وكود كومند أخرى .
مثلا تعالوا نشوف مذا يحصل حين يقوم الشيل بتنفيذ الكومند compress التي تكمن مهمتها في ضغط الملف :
[PHP]
chmod a+x file
[/PHP]
1) تحصل عملية إستنساخ لبروسس الشيل فيكون لدينا 2 بروسس شيل متطابقان.
2) الشيل الأب يبقى في حالة إنتظار إنتهاء تنفيذ الشيل الإبن .
3) الشيل الإبن يستبدل كوده التنفيذي بكود الكومند chmod
4)تنفذ الكومند chmod وتعطي صلاحية للملف file وحين تنتهي ، يختفي الإبن .
5) الأب يرجع لنشاطه ليعرض الأمر التالي .
وهذه صورة توضيحية للخطوات السابقة التي ذكرناها : نأخذ مثال : [PHP]
#include
#include
#include
int main()
{ char* arg[] = {"ping" , "www.google.com" , NULL};
printf("SALAM ALIKOM :) \n\n");
execvp("ping", arg);
return 0;
}
[/PHP]
هذا الكود عند تنفيذه يكتب السلام عليكم ثم ينفذ الكومند
ping على هوست الجوجل وكل هذا يقام على 5 خطوات اتي شرحتها مع الكومند
chmodنفس الشي .
يتبع بإذن الله