قبلا با نوشتن یک فرآیند -Process- ابتدایی در لینوکس به وسیله تابع system کمی آشنا شدیم . اما همانطور که گفتم روش اصولی استفاده از تابع fork و ساخت یک فرآیند فرزند -child Process- و تغییر این فرآیند جدید طبق نیازمون هست .
در برنامه نویسی سیستمی ویندوز (win32) از توابع از پیش نوشته شده ای مثل CreateProcess برای ساخت یک process جدید استفاده میشود . در لینوکس این تابع در دسترس نیست ولی توابع fork و exec کار مشابهی را برای ما انجام میدهند .
تابع fork
با استفاده از فراخوانی تابع fork لینوکس یک فرآیند فرزند کاملا مشابه فرآیند والد -parent Process- ایجاد میکند . فرآیند فرزند با اینکه کاملا مشابه والد خود است اما در فضای حافظه متفاوتی اجرا میشود و بعد از فراخوانی تابع fork مسیر متفاوتی نسبت به والد خود طی میکند . با توجه به این موضوع که فرآیند فرزند یک فرآیند جدید است ، شناسه متفاوتی با فرآیند والد خود دارد و با توجه به همین موضوع میتوان تشخیص داد فرآیندی که در حال اجراست فرآیند فرزند است یا فرآیند والد . مقدار بازگشتی تابع fork در فرآیند والد برابر با شناسه فرآیند فرزند است ولی این مقدار در فرآیند فرزند برابر با عدد ۰ است . با چک کردن این عدد ( مقدار بازگشتی تابع fork ) به راحتی میتوان تشخیص داد فرآیند در حال اجرا فرآیند والد است یا فرزند .
در برنامه زیر در صورتیکه فرآیند فرزند در حال اجرا باشد شرط if صحیح است و دستورات بلاک بالا اجرا میشوند و درصورتیکه فرآیند والد در حال اجرا باشد شرط if صحیح نیست و بلاک مربوط به else اجرا میشود . فرآیند فرزند ۱۰ مرتیه و فرآیند والد ۲۰ مرتبه اجرا میشوند و هر کدام بعد از هربار اجرا به مدت ۱ ثانیه تاخیر ایجاد میکنند :
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main () { pid_t child_pid; int count1 , count2; printf ("the main process id before fork , is %d\n" , (int) getpid()); child_pid = fork (); if (child_pid == 0 ) { printf ("this is the child Process with id %d\n" , (int) getpid()); while(count1 < 10) { printf("child Process : %d\n" , count1 ); sleep (1); count1++; } } else { printf ("this is parent Process with id %d\n" , (int) getpid()); while (count2 < 20) { printf ("Parent Process : %d\n" , count2 ); sleep (1); count2++; } } return 0 ; }
در سایت دانشگاه واترلو یک مثال ابتدایی ( شبیه به همین چیزی که من نوشتم ) از توابع fork وexec وجود داره .
این نوشته قبلا در وبلاگ من به آدرس https://nutshell.ir منتشر شده بود.
هیچ نظری موجود نیست:
ارسال یک نظر