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: כותב את המספרים 1 עד 20 (כל מספר בשורה נפרדת) לצינור הראשון
- תהליך 2: קורא מהצינור הראשון, מסנן רק מספרים זוגיים, וכותב אותם לצינור השני
- תהליך 3: קורא מהצינור השני ומדפיס את המספרים למסך
הפלט הצפוי הוא המספרים הזוגיים מ-1 עד 20 (כלומר: 2, 4, 6, 8, 10, 12, 14, 16, 18, 20).
רמזים:
- תצטרכו שני צינורות (שני קריאות ל-pipe)
- שלושה קריאות ל-fork
- סגרו את כל הfd-ים שלא בשימוש בכל תהליך
- ניתן לעבוד עם טקסט (שורות) ולהשתמש ב-fdopen כדי להמיר fd ל-FILE* לנוחות, או לעבוד ישירות עם read/write