לדלג לתוכן

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  -->  [pipe]  -->  process 2  -->  [pipe]  -->  process 3
  • ה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