process יצירת בן, כיצד?

helloworld5

New member
process יצירת בן, כיצד?

על פי האתר
https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/3_Processes.html
אני מבין ש FORK זה יצירת תהליך בן, הפונקציה כנראה מחזירה PID שזה מספר הפרוסס, סבבה
אשמח להסבר של התמונות הבאות
תמונה1 - לא הבנתי מה התרשים אומר
תמונה2- תיכנות אני מבין אב לאת הקוד לא הבנתי
אני מבין שמנסים ליצור כאן תהליך בן ע"י fork, אם יחזיר pid קטן מ 0 כנראה שתקלה , סבבה
לא הבנתי מה זה אומר כאשר pid==0
ולמה בלוק האחרון ישwait,
כמו כן מה עושות הפקודות exec (הבנתי שזה אמור להריץ את התהליך?)
כי בקוד בתמונה 2 יש execpl ,

אשמח להסברים
תודה
 

BravoMan

Active member
תיכנות אתה מבין? חמוד...

סליחה, לא יכולתי להתאפק

&nbsp
עקרונית, נושא יצירת תהליכים תלוי בסביבה בה אתה עובד, ספציפית בשילוב מערכת הפעלה ושפת תכנות.
fork ו-exec הן API של מערכות שמיישמות סטנדרט POSIX, כגון מערכות מבוססות לינוקס.
&nbsp
נתחיל מ-exec כי יש בה טריק קטן שחשוב להבין:
זו לא פונקציה שמפעילה תוכנה אחרת מתוך התוכנה שלך!
זו פונקציה שמחליפה תהליך נוכחי, בתהליך אחר, והתהליך הנוכחי מפסיק ברגע שקוראים לה.
&nbsp
נניח שיש לך קובץ ריצה שנקרא a ואתה רוצה שהוא יריץ קובץ אחר, b, ואחרי ההרצה ידפיס הודעה כלשהי.
אובכן, אם תשתמש ב-exec, כדי להריץ את b ההודעה לעולם לא תודפס, כי שום קוד ב-a אחרי הקריאה ל-exec לא יתבצע. במקום זה, ייטען b ויתחיל לרוץ כרגיל.
&nbsp
עכשיו, לגבי פקודה fork:
הפקודה הזו יוצרת העתק של התהליך שלך שממשיך לרוץ בדיוק מהשורה שאחרי fork.
&nbsp
עכשיו, בגלל שזה העתק מדויק, זה כאילו הרצת את התוכנה שלך פעמיים.
אז, איך הקוד יכול לדעת אם הוא "עותק" - תהליך בן, או אם הוא המקור?
פשוט: לפי הערך החוזר של fork!
&nbsp
מי שיקבל מ-fork את הערך 0, יהיה ההעתק - תהליך "בן" החדש.
מי שיקבל PID תקין (גדול מ-0) הוא האבא - כלומר, התהליך המקורי, שיודע שיצירת תהליך נוסף בוצעה בהצלחה, ויודע גם את הזהות (PID) של התהליך שנוצר.
&nbsp
בתרשים הראשון רואים בחלק העליון מה קורה בתהליך האבא - התהליך המקורי, ובחלק התחתון מה קורה בתהליך הבן, והכל אחרי הפעלת ה-fork.
שוב - בגלל שמדובר באותו קוד בדיוק שרץ, הקוד צריך לבדוק את הערך החוזר כדי לדעת אם הוא רץ כאבא או בן.
&nbsp
הקוד בתמונה השנייה מדגים בדיוק את מה שאמרתי לגבי exec.
הוא עושה פעולה פשוטה: מריץ תוכנה אחת מתוך תוכנה אחרת, ממתין שהיא תסתיים, ואז מדפיס הודעה.
זוכר שאמרתי ש-exec מחליף את התהליך שקרא לו בתהליך אחר, והקוד שאחריו לא יתבצע?
כאן בדיוק נכנס fork לתמונה:
קודם מפצלים תהליך בן, האבא מקבל חזרה את ה-PID שלו, ויכול להמתין עד שהתהליך הזה יסתיים, ואז לבצע פעולות נוספות.
&nbsp
תהליך הבן בינתיים, קורא ל-exec, מוחלף בתוכנה אחרת שרצו להריץ (בדוגמה זו ls), והתוכנה החדשה רצה עם ה-PID של הבן, כלומר, האבא כעת למעשה ממתין שהתוכנה החדשה תסתיים.
&nbsp
מקווה שההסבר הזו מובן, למרות שהוא קצת ארוך.
 

helloworld5

New member
תגובה מעולה...רק...

רק כמה שלא הבנתי
1)אם ב FORK, מי שהוא PID==0 זה הבן
אם תהליך יצר כמה בנים, איך ידע להבחין בניהם? אך יוכל לבחור איזה בן להריץ?
2) בקוד לא הבנתי, הוא עושה FORK, ומקבל PID ואז בודק אם ה PID קטן מ 0 יש שגיאה- זה סבבה, אבל אם ה PID הוא 0 או גדול מ 0? למה שהוא יהיה גדול מ 0? הרי יצרתי בן ו PID גדול מ 0 זה אב
למה שהFORK יחזיר PID של האב? הוא צריך להחזיר PID של הבן הרי
או שבעצם שלאחר שהבן יסיים לרוץ עם ה PID==0 ה PID ישתנה ואז הוא יהיה גדול מ 0 והתוכנית תמשיך מה ELSE האחרון?
.משהו כאן לא סגור לי
3) לגבי מה שאמרת ש PID==0 זה אב אני לא מצליח להבין את התרשים המצורף
אם הבנתי נכון זה רק בא להראות תרשים שאב (פרוסס) יוצא בנים(פרוססים)
אז למה ה PID שלהם ככה?
או שהעניין ש PID הוא 0 או גדול מ 0 זה רק ביחס לאותו קטע קוד שידע לרוץ ובאמת כל תהליך מקבל PID אמיתי שהוא גדול מ 0?

 

BravoMan

Active member
תשובות:

1) אם תהליך אב יצר לעצמו כמה בנים, הם לא יהיו מודעים אחד לשני.
כל בן רק יודע שהוא בן כי הוא יקבל 0 מ-fork.
רק האבא יכיר את כולם, כי עבור כל אחד מהם הוא יקבל PID שונה בקריאה ל-fork.
&nbsp
שוב - ה-PID גדול מ-0 ש-fork מחזירה הוא של הבן, והוא חוזר לאבא!
&nbsp
בכל מקרה, אתה צריך להבין שברגע ש-fork בוצע הבן כבר רץ.
&nbsp
2) ה-fork מחזיר דברים שונים בתהליכים שונים:
תהליך הבן תמיד יקבל 0 - ככה הוא יודע שהוא "תהליך בן". זה לא ה-PID שלו.
תהליך האב - הוא זה שיקבל חזרה ערך גדול מ-0, וזה לא יהיה PID של האב אלא PID של הבן שזה עתה נוצר!
&nbsp
ככה האבא יודע למי להמתין.
&nbsp
שוב - אם בבדיקה חזר אפס, זה אומר שהקוד כרגע רץ בתוך עותק חדש.
אם חזר משהו גדול מ-0, זה הקוד המקורי ממשיך תקין אחרי שה-fork הצליח לו.
&nbsp
ברור? זו הנקודה הכי חשובה בשימוש ב-fork, אז אם עדיין לא מובן תגיד לי.
&nbsp
3) אין באמת תהליך ש-PID שלו שווה 0. כמעת.
&nbsp
התרשים מעט מטעה:
הוא מציג לך תהליך מיוחד במערכת - תהליך sched.
התהליך הזה הוא חלק מה-kernel של המערכת, הוא אחראי על ניהול זיכרון ו-swap, ולכן הוא זוכה ב-PID מיוחד שערכו באמת 0.
&nbsp
אף תהליך אחר לא רשאי להשתמש ב-PID הזה כמזהה שלו.
&nbsp
בגלל שלאף תהליך אחר במערכת לא יכול להיות PID == 0, אפשר להשתמש בערך 0 כערך חוזר של fork כדי לסמן שהקוד רץ כתהליך בן.
ברור שזה לא ערך חוקי של PID, וגם לא ערך שלילי ששמור לשגיאות.
&nbsp
אם הבן רוצה לברר איזה PID הוא קיבל, הוא פשוט יתשאל את המערכת עם הפונקציה המתאימה.
 
למעלה