לדלג לתוכן

5.6 צינורות תרגול

תרגול - צינורות - pipes

תרגיל 1 - אב שולח הודעה לבן

כתבו תוכנית שיוצרת צינור עם pipe, קוראת ל-fork, ואז:
- האב שולח את המחרוזת "hello child!" דרך הצינור
- הבן קורא את ההודעה מהצינור ומדפיס אותה למסך

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


תרגיל 2 - בן שולח PID לאב

כתבו תוכנית שיוצרת צינור, קוראת ל-fork, ואז:
- הבן שולח את הPID שלו כמחרוזת דרך הצינור לאב
- האב קורא את ההודעה מהצינור ומדפיס אותה

רמז: השתמשו ב-sprintf כדי להמיר את הPID (שהוא מספר) למחרוזת לפני הכתיבה לצינור.


תרגיל 3 - מימוש ls | wc -l

ממשו תוכנית שמבצעת את מה שהפקודה ls | wc -l עושה בshell.

התוכנית צריכה:
1. ליצור צינור עם pipe
2. ליצור שני תהליכי בן עם fork
3. בן ראשון: להפנות את stdout לצד הכתיבה של הצינור ולהריץ execve("/bin/ls", ...)
4. בן שני: להפנות את stdin לצד הקריאה של הצינור ולהריץ execve("/usr/bin/wc", ...)
5. האב: לסגור את שני צדדי הצינור ולחכות לשני הבנים

רמז: חזרו לדוגמה של ls | grep .c בהרצאה - המבנה זהה.


תרגיל 4 - תקשורת דרך FIFO

כתבו שתי תוכנות נפרדות שמתקשרות דרך צינור עם שם (FIFO):

תוכנה א - הכותב (writer.c):
- יוצרת FIFO בנתיב /tmp/my_fifo עם mkfifo
- פותחת את הFIFO לכתיבה
- כותבת הודעה וסוגרת
- מוחקת את הFIFO עם unlink

תוכנה ב - הקורא (reader.c):
- פותחת את הFIFO לקריאה
- קוראת את ההודעה ומדפיסה אותה
- סוגרת

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


תרגיל 5 - שרשרת של שלושה תהליכים

כתבו תוכנית שיוצרת שרשרת של 3 תהליכים מחוברים בצינורות:

תהליך 1  -->  [צינור]  -->  תהליך 2  -->  [צינור]  -->  תהליך 3
  • תהליך 1: כותב את המספרים 1 עד 20 (כל מספר בשורה נפרדת) לצינור הראשון
  • תהליך 2: קורא מהצינור הראשון, מסנן רק מספרים זוגיים, וכותב אותם לצינור השני
  • תהליך 3: קורא מהצינור השני ומדפיס את המספרים למסך

הפלט הצפוי הוא המספרים הזוגיים מ-1 עד 20 (כלומר: 2, 4, 6, 8, 10, 12, 14, 16, 18, 20).

רמזים:
- תצטרכו שני צינורות (שני קריאות ל-pipe)
- שלושה קריאות ל-fork
- סגרו את כל הfd-ים שלא בשימוש בכל תהליך
- ניתן לעבוד עם טקסט (שורות) ולהשתמש ב-fdopen כדי להמיר fd ל-FILE* לנוחות, או לעבוד ישירות עם read/write