5.6 - צינורות - תרגול
תרגול - צינורות - pipes¶
תרגיל 1 - אב שולח הודעה לבן¶
כתבו תוכנית שיוצרת pipe עם pipe, קוראת ל-fork, ואז:
- האב שולח את המחרוזת "hello child!" דרך הpipe
- הבן קורא את ההודעה מהpipe ומדפיס אותה למסך
אל תשכחו לסגור את הצדדים שלא בשימוש בכל process.
תרגיל 2 - בן שולח PID לאב¶
כתבו תוכנית שיוצרת pipe, קוראת ל-fork, ואז:
- הבן שולח את הPID שלו כמחרוזת דרך הpipe לאב
- האב קורא את ההודעה מהpipe ומדפיס אותה
רמז: השתמשו ב-sprintf כדי להמיר את הPID (שהוא מספר) למחרוזת לפני הכתיבה לpipe.
תרגיל 3 - מימוש ls | wc -l¶
ממשו תוכנית שמבצעת את מה שהפקודה ls | wc -l עושה בshell.
התוכנית צריכה:
1. ליצור pipe עם pipe
2. ליצור שני processes בן עם fork
3. בן ראשון: לredirect את stdout לצד הכתיבה של הpipe ולהריץ execve("/bin/ls", ...)
4. בן שני: לredirect את stdin לצד הקריאה של הpipe ולהריץ execve("/usr/bin/wc", ...)
5. האב: לסגור את שני צדדי הpipe ולחכות לשני הבנים
רמז: חזרו לדוגמה של ls | grep .c בהרצאה - המבנה זהה.
תרגיל 4 - תקשורת דרך FIFO¶
כתבו שתי תוכנות נפרדות שמתקשרות דרך pipe עם שם (FIFO):
תוכנה א - הכותב (writer.c):
- יוצרת FIFO בנתיב /tmp/my_fifo עם mkfifo
- פותחת את הFIFO לכתיבה
- כותבת הודעה וסוגרת
- מוחקת את הFIFO עם unlink
תוכנה ב - הקורא (reader.c):
- פותחת את הFIFO לקריאה
- קוראת את ההודעה ומדפיסה אותה
- סוגרת
כדי לבדוק, הריצו את שתי התוכנות במקביל בשני טרמינלים שונים (הריצו קודם את הכותב, ואז את הקורא - או להפך, open יחסום עד ששני הצדדים מחוברים).
תרגיל 5 - שרשרת של שלושה processes¶
כתבו תוכנית שיוצרת שרשרת של 3 processes מחוברים בpipes:
- הprocess 1: כותב את המספרים 1 עד 20 (כל מספר בשורה נפרדת) לpipe הראשון
- הprocess 2: קורא מהpipe הראשון, מסנן רק מספרים זוגיים, וכותב אותם לpipe השני
- הprocess 3: קורא מהpipe השני ומדפיס את המספרים למסך
הפלט הצפוי הוא המספרים הזוגיים מ-1 עד 20 (כלומר: 2, 4, 6, 8, 10, 12, 14, 16, 18, 20).
רמזים:
- תצטרכו שני pipes (שני קריאות ל-pipe)
- שלושה קריאות ל-fork
- סגרו את כל הfd-ים שלא בשימוש בכל process
- ניתן לעבוד עם טקסט (שורות) ולהשתמש ב-fdopen כדי להמיר fd ל-FILE* לנוחות, או לעבוד ישירות עם read/write