۱۴۰۱ دی ۱۳, سه‌شنبه

ایجاد یک فرآیند توسط تابع fork

 

fork linux

قبلا با نوشتن یک فرآیند -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 منتشر شده بود.

هیچ نظری موجود نیست:

ارسال یک نظر