فورک شدن فرایند ها در لینوکس

فرایند ها در لینوکس یک آی دی یونیک دارند که به آن PID می گویند.برای ایجاد یک فرایند فرزند ازتابع ()fork استفاده می شود.اما چه نیازی به فورک شدن یک فرایندوجود دارد؟ برای آنکه بتوانید چند کار را به صورت همزمان انجام دهید فرایند ها فورک می شوند.اگر مطلب را نگرفتید نگران نباشید.خب بایک مثال شروع می کنیم:


#incldue <stdio.h>

int main()
{
    printf("This is a test for fork");
    return 0;
}


خروجی این برنامه چیست؟ این برنامه یک پیام را به خروجی استاندارد می فرستد.

This is a test for fork

حالا بیاید با این کد بازی کنیم

#include <stdio.h>
#include <unistd.h> 

int main()
{
    fork();
    printf("This is a test for fork");
    return 0;
}

بیایید برروی خروجی این کد بحث کنیم.

This is a test for forkThis is a test for fork

پیام دو بار پشت سرهم در خروجی استاندارد قرارگرفته است.در شروع کد از تابع fork استفاده کردیم.در رابطه با کارکرد fork چه حدسی می زنید؟


با دستور fork یک فرایند دیگر مشابه با فرایند اصلی ایجاد می شود اما . . .

فرایند ایجاد شده که به آن فرایند فرزند می گویند یک کپی از فرایند والد است یعنی تمام متغیر ها و عباراتی که در فرایند والد وجود دارد عینا در فرایند فرزند کپی می شود.اما سیستم عامل به فرایند فرزند آدرس و حافظه مستقل از فرایند والد تخصیص می دهد.


خب بیاید fork را بیشتر بررسی کنیم...


زمانی که در برنامه فورک فراخوانی می شوداین تابع مقداری را برمی گرداند.تابع فورک در فرایند والد pidفرایند فرزند و در فرایند فرزند مقدار صفر را بر می گرداند و در صورتی که این تابع نتواند فرایند جدیدی ایجادکند مقدار1- رابر می گرداند.


دو نکته بسیار مهم :

*فرایند فرزند و فرایند والد به صورت همزمان اجرا می شوند.

*بعد از اجرای تابع فورک هر دو فرایند فرزند و والد خط بعد از فورک را اجرا می کنند.


یک مثال دیگر می زنیم :


#include <stdio.h>
#include <unistd.h>

int main()
{
    pid_t pid;
    
    pid = fork();
    
    if(pid == 0)
    {
        printf("in child process");
        exit(0);
    }
    else if (pid > 0)
    {
        printf("in parent proess")
    }
    else
    {
        printf("process fork failed !");
    }
    return 0;
}


توضیح مثال :
استراکت pid_t استراکتی برای نگه داری pid فرایند ایجاد شده است.پس از فراخوانی تابع فورک مقدار برگشت داده شده توسط این تابع در pid قرار می گیرد.با توجه به مقدار pid تعیین میکنیم که در هر کدام از فرایند های والد و فرزند چه چیزی اجرا شود و در صورتی که ایجاد فرایند شکست بخورد چه کدی اجرا شود.
حالا نوبت شماست ...
در فرایند فرزند عبارت ()exit را حذف کنید و یکبار دیگر کد را اجرا کنید.



فرایند والد و فرایند فرزند مستقل از هم به صورت هم زمان اجرا می شوند اما با تابع ()wait میتوانیم آن ها را به هم ربط دهیم.
طرز کار تابع ()wait :

#include <stdio.h>
#include <unistd.h>

int main()
{
    pid_t pid;
    
    pid = fork();
    
    int status;
    
    pid = wait();
    
    if(pid == 0)
    {   
        printf("\nin child process\n");
        exit(0)
    }
    else if(pid > 0)
    {
        printf("\nin parent process\n");
    }
    else
    {
        printf("\nfork failed\n");
    }
    
    pid_t ret_pid;
    
    ret_pid = wait(&status);
    
    printf("child process finished with pid [%d] and status [%d]", (int)ret_pid, status);
    
    return 0;
}
تابع ()wait آی دی فرایند فرزندی را که اجرای آن تمام شده و حالت آن را برمی گرداند(اگر status برابر صفر شود اجرای فرایند موفقیت آمیز بوده است).
این تابع باعث خواهد شد فرایند والد تا اتمام فرایند فرزند منتظر بماند. 

شاد و پیروز باشید.


ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی
کپی‌ رایت رزومه فید بیان قالب : عرفـــ ـــان