מערכת מזלג שיחת לינוקס

Fork System Call Linux



קריאת מערכת המזלג משמשת ליצירת תהליכים חדשים. התהליך החדש שנוצר הוא תהליך הילד. התהליך שקורא מזלג ויוצר תהליך חדש הוא תהליך האב. תהליכי הילד וההורה מבוצעים במקביל.

אך תהליכי הילד וההורה שוכנים במרחבי זיכרון שונים. למרחבי זיכרון אלה יש אותו תוכן וכל פעולה שתבוצע בתהליך אחד לא תשפיע על התהליך השני.







כאשר נוצרים תהליכי הילד; כעת לשני התהליכים יהיה אותו מונה תכניות (PC), כך ששני התהליכים הללו יצביעו על אותה הוראה הבאה. הקבצים שנפתחו על ידי תהליך האב יהיו זהים לתהליך הילד.



תהליך הילד הוא בדיוק כמו ההורה שלו אך יש הבדל במזהי התהליכים:



  1. מזהה התהליך של תהליך הילד הוא מזהה תהליך ייחודי השונה מזהה של כל התהליכים הקיימים האחרים.
  2. מזהה תהליך ההורה יהיה זהה לזה של תהליך ההורה של ההורה של הילד.

מאפייני תהליך הילד

להלן כמה מהמאפיינים שתהליך ילד מחזיק:





  1. מוני המעבד וניצול המשאבים מאתחלים לאפס לאפס.
  2. כאשר תהליך האב מסתיים, תהליכי הילד אינם מקבלים שום אות מכיוון שהתכונה PR_SET_PDEATHSIG ב- prctl () מאופסת.
  3. החוט המשמש לקריאת fork () יוצר את תהליך הילד. כך שהכתובת של תהליך הילד תהיה זהה לזו של ההורה.
  4. מתאר הקבצים של תהליך האב יורש בתהליך הילד. לדוגמה קיזוז הקובץ או סטטוס הדגלים ותכונות הקלט/פלט ישותפו בין מתארי הקבצים של תהליכי הילד וההורה. אז מתאר הקבצים של כיתת הורים יתייחס לאותו מתאר קבצים של מחלקת ילדים.
  5. מתארי תורי ההודעות הפתוחים של תהליך האב עוברים בתורשה בתהליך הילד. לדוגמה, אם מתאר קובץ מכיל הודעה בתהליך האב, אותה הודעה תהיה קיימת בתיאור הקבצים המתאים של תהליך הצאצא. אז נוכל לומר שערכי הדגל של מתארי הקבצים האלה זהים.
  6. באופן דומה זרמי ספריות פתוחים יירשו על ידי תהליכי הצאצא.
  7. ערך ברירת המחדל של הטיימר של כיתת הילד זהה לערך הטווח הנוכחי של הטיימר של מחלקת ההורים.

נכסים שאינם עוברים בירושה בתהליך הילד

להלן כמה מהנכסים שאינם עוברים בתורשה בתורשה:

  1. מנעולי זיכרון
  2. האות הממתין של כיתת ילדים ריק.
  3. תהליך נעילת רשומות הקשורות (fcntl ())
  4. פעולות קלט/פלט אסינכרוני ותכולת קלט/פלט.
  5. הודעות על שינוי מדריך.
  6. טיימרים כגון אזעקה (), setitimer () אינם עוברים בירושה על ידי כיתת הילד.

מזלג () ב- C

אין ארגומנטים במזלג () וסוג החזרה של המזלג () הוא מספר שלם. עליך לכלול את קבצי הכותרת הבאים בעת שימוש ב- fork ():



#לִכלוֹל
#לִכלוֹל
#לִכלוֹל

כאשר עובדים עם מזלג (), ניתן להשתמש עבור סוג pid_t עבור תהליכי מזהים כפי pid_t מוגדר ב-.

קובץ הכותרת הוא המקום שבו fork () מוגדר ולכן עליך לכלול אותו לתוכנית שלך כדי להשתמש ב- fork ().

סוג ההחזרה מוגדר ב- ו- fork () קריאה מוגדרת ב-. לכן, עליך לכלול את שניהם בתוכנית שלך כדי להשתמש בשיחת מערכת fork ().

תחביר המזלג ()

התחביר של שיחת מערכת fork () בלינוקס, אובונטו הוא כדלקמן:

pid_t מזלג (void);

בתחביר סוג ההחזרה הוא pid_t . כאשר תהליך הילד נוצר בהצלחה, ה- PID של תהליך הילד מוחזר בתהליך האב ו -0 יוחזר לתהליך הילד עצמו.

אם יש שגיאה כלשהי אז -1 מוחזר לתהליך האב והתהליך הצאצא אינו נוצר.

No arguments are passed to fork(). 

דוגמה 1: קורא מזלג ()

שקול את הדוגמה הבאה בה השתמשנו בשיחת המערכת fork () כדי ליצור תהליך צאצא חדש:

קוד:

#לִכלוֹל
#לִכלוֹל
#לִכלוֹל

intרָאשִׁי()
{
מזלג();
printf ('שימוש במערכת fork () n');
לַחֲזוֹר 0;
}

תְפוּקָה:

שימוש במערכת fork ()
שימוש במערכת fork ()

בתוכנית זו השתמשנו במזלג (), הדבר ייצור תהליך ילדים חדש. כאשר תהליך הילד נוצר, הן תהליך ההורה והן תהליך הילד יצביעו על ההוראה הבאה (אותו מונה תוכניות). בדרך זו ההוראות הנותרות או הצהרות C יבוצעו המספר הכולל של זמני התהליך, כלומר 2נפעמים, כאשר n הוא מספר קריאות המערכת ().

אז כאשר השימוש במזלג () משמש פעם אחת כמפורט לעיל (21= 2) יהיה לנו התפוקה פעמיים.

כאן כאשר נעשה שימוש בקריאת המערכת מזלג (), המבנה הפנימי ייראה כך:

שקול את המקרה הבא בו משתמשים במזלג () 4 פעמים:

קוד:

#לִכלוֹל
#לִכלוֹל
#לִכלוֹל

intרָאשִׁי()
{
מזלג();
מזלג();
מזלג();
מזלג();
printf ('שימוש בשיחת מערכת מזלג ()');
לַחֲזוֹר 0;
}

תְפוּקָה:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call 

כעת המספר הכולל של התהליך שנוצר הוא 24= 16 ואנו מבצעים את הצהרת ההדפסה שלנו 16 פעמים.

דוגמה 2: בדיקה אם מזלג () הצליח

בדוגמה הבאה השתמשנו במבנה קבלת ההחלטות כדי לבדוק את הערך (int) שהוחזר על ידי מזלג (). וההודעות המתאימות מוצגות:

קוד:

#לִכלוֹל
#לִכלוֹל
#לִכלוֹל

intרָאשִׁי()
{
pid_t p;
עמ=מזלג();
אם(עמ== -1)
{
printf ('יש שגיאה בעת קריאת fork ()');
}
אם(עמ==0)
{
printf ('אנחנו בתהליך ילדים');
}
אַחֵר
{
printf ('אנחנו בתהליך הורים');
}
לַחֲזוֹר 0;
}

תְפוּקָה:

אנו נמצאים בתהליך הורים
אנחנו בתהליך ילדים

בדוגמה למעלה השתמשנו בסוג pid_t שיאחסן את ערך ההחזרה של fork (). fork () נקרא ברשת:

עמ=מזלג();

אז ערך המספר השלם המוחזר על ידי מזלג () מאוחסן ב- p ואז משווים p כדי לבדוק אם שיחת המזלג () שלנו הצליחה.

כאשר נעשה שימוש בשיחת המזלג () והילד נוצר בהצלחה, מזהה תהליך הילד יוחזר לתהליך ההורה ו 0 יוחזר לתהליך הילד. מזהה תהליך הילד בתהליך הורה לא יהיה זהה לזה של מזהה תהליך הילד בתהליך הילד עצמו. בתהליך הילד, מזהה תהליך הילד יהיה 0.

בעזרת הדרכה זו תוכל לראות כיצד להתחיל בשיחת מערכת המזלג בלינוקס.