fork

bennylinuxLeave a Comment

התהליך (כל תהליך זה בעצם כל הפונקציה) עושה fork, שזה שכפול של התהליך ניתן לחשוב על כך כאילו רצות כרגע שני פונקציות main במקביל בתהליך fork האב מקבל את ה ID של הבן שזה גדול מ 0 אם הפורק הצליח, וקטן מ 0 אם ה fork נכשל והבן עצמו מקבל ערך 0 למשתנה childPID, משתנה זה קיים בשני הפונקציות ואין קשר ביניהם, זה כמו שני פונקצות שונות שרצות יחד, ולכל אחת מהן יש את המשתנה childPID באופן עצמאי, אצל האב childPID גדול מ 0 ואצל הבן childPID שווה 0, חשוב לציין שבתהליך הבן המשך הפונקציה יתחיל רק מההוראה הבא, כלומר לאחר שהאב עושה fork נוצר בן והבן ממשיך מהשורה שלאחר ביצוע הfork ולכן התנאי הראשון מתקיים, כי המשתנה childPID כרגע אכן גדול מ 0 אבל התנאי השני של שווה ל 0 לא מתקיים ולכן הפלט הראשון יהיה [Parent process :: var_lcl = [10], var_glb[20 כי הופעל ה else ובתהליך הבן כיוון שהמשתנה childPID שווה 0 הפלט יהיה [Child Process :: var_lcl = [1], var_glb[1

 

#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>

int var_glb; /* A global variable*/

int main(void)
{
    pid_t childPID;
    int var_lcl = 0;

    childPID = fork();

    if(childPID >= 0) // fork was successful
    {
        if(childPID == 0) // child process
        {
            var_lcl++;
            var_glb++;
            printf("\n Child Process :: var_lcl = [%d], var_glb[%d]\n", var_lcl, var_glb);
        }
        else //Parent process
        {
            var_lcl = 10;
            var_glb = 20;
            printf("\n Parent process :: var_lcl = [%d], var_glb[%d]\n", var_lcl, var_glb);
        }
    }
    else // fork failed
    {
        printf("\n Fork failed, quitting!!!!!!\n");
        return 1;
    }

    return 0;
}<span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span>

סרטון הסבר על תהילך fork

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *