שאלת מבחן במערכות הפעלה - האוניברסיטה הפתוחה 2019 - תהליכים

הסבירו מה נעשה בשורות קוד הבאות:

העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד 872019סמסטר ב
תהליכיםforkpipeקריאות מערכתקלט/פלט
הקוד מדגים תקשורת בין-תהליכית (IPC) בין תהליך אב לתהליך בן. שימו לב לקריאות המערכת pipe ו-fork כדי להבין כיצד נוצר ערוץ התקשורת וכיצד הוא משותף בין התהליכים.
קטע הקוד מדגים תקשורת בין-תהליכית (IPC - Inter-Process Communication) בין תהליך אב לתהליך בן באמצעות צינור (pipe).

1. `pipe(fd)`: בתחילה, התהליך הראשי מבצע קריאת מערכת pipe. קריאה זו יוצרת צינור חד-כיווני ומחזירה שני מתארי קבצים (file descriptors) במערך fd: fd[0] משמש לקריאה מהצינור, ו-fd[1] משמש לכתיבה לצינור. כל מה שנכתב ל-fd[1] ניתן לקריאה מ-fd[0].

2. `fork()`: לאחר יצירת הצינור, התהליך מבצע קריאת מערכת fork. קריאה זו יוצרת תהליך בן חדש, שהוא העתק של התהליך המקורי (תהליך האב). שני התהליכים (האב והבן) ממשיכים את ריצתם מהנקודה שאחרי ה-fork, ושניהם יורשים את מתארי הקבצים של הצינור שנוצר.
  • בתהליך האב, fork מחזיר את מזהה התהליך (PID) של הבן (מספר חיובי).
  • בתהליך הבן, fork מחזיר 0.


3. לוגיקת תהליך האב (`pid > 0`):
  • close(fd[0]): האב סוגר את צד הקריאה של הצינור, מכיוון שהוא מתכוון רק לכתוב אליו. זוהי פרקטיקה טובה למנוע בעיות.
  • write(fd[1], "hello world\n", 12): האב כותב את המחרוזת "hello world
" (12 בתים) לתוך צד הכתיבה של הצינור.

4. לוגיקת תהליך הבן (`pid == 0`):
  • close(fd[1]): הבן סוגר את צד הכתיבה של הצינור, מכיוון שהוא מתכוון רק לקרוא ממנו.
  • n = read(fd[0], line, 2048): הבן מנסה לקרוא נתונים מצד הקריאה של הצינור. קריאת read היא חוסמת, ולכן התהליך ימתין עד שיהיו נתונים זמינים בצינור (שנכתבו על ידי האב). הנתונים נקראים לתוך המערך line, ומספר הבתים שנקראו בפועל נשמר במשתנה n.
  • write(1, line, n): הבן כותב את הנתונים שקרא מהצינור אל הפלט הסטנדרטי (stdout), שמתאר הקובץ שלו הוא 1. התוצאה היא הדפסת המחרוזת "hello world" על המסך.


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