לדלג לתוכן

5.5 מתארי קבצים תרגול

תרגול - מתארי קבצים - file descriptors

תרגיל 1 - כתיבה לקובץ עם write

כתבו תוכנית שפותחת קובץ בשם hello.txt לכתיבה (עם O_WRONLY | O_CREAT | O_TRUNC), כותבת אליו את המחרוזת "hello from fd!\n" באמצעות הsyscall write (לא fprintf או fwrite), וסוגרת את הקובץ.

שימו לב: השתמשו ב-strlen כדי לחשב את אורך המחרוזת לכתיבה.


תרגיל 2 - הפניית stdout לקובץ עם dup2

כתבו תוכנית שמפנה את stdout לקובץ בשם redirected.txt באמצעות dup2, ואז משתמשת ב-printf כדי לכתוב כמה שורות. הריצו את התוכנה וודאו שהפלט מופיע בקובץ ולא על המסך.

רמז: פתחו את הקובץ עם open, השתמשו ב-dup2 כדי להעתיק את הfd שקיבלתם לתוך fd 1 (stdout), וסגרו את הfd המקורי.


תרגיל 3 - קריאת קובץ בית-אחר-בית

כתבו תוכנית שקוראת קובץ טקסט (למשל קובץ שיצרתם בתרגיל 1) בית אחרי בית באמצעות הsyscall read, ומדפיסה כל תו למסך באמצעות write לfd 1 (stdout).

רמז: קראו כל פעם בית אחד (read(fd, &c, 1)) בלולאה עד שread מחזירה 0 (סוף הקובץ).


תרגיל 4 - אב ובן כותבים לאותו קובץ

כתבו תוכנית שפותחת קובץ בשם pids.txt לכתיבה, קוראת ל-fork, ואז גם האב וגם הבן כותבים את הPID שלהם לקובץ באמצעות write.

רמזים:
- השתמשו ב-getpid() כדי לקבל את הPID
- השתמשו ב-sprintf כדי להמיר את הPID למחרוזת לפני הכתיבה
- אל תשכחו שהאב צריך לחכות לבן עם wait


תרגיל 5 - שאלה תיאורטית

הסבירו: מה קורה למתארי קבצים הפתוחים כאשר תהליך קורא ל-execve?

למשל, אם תהליך פתח קובץ וקיבל fd 3, ואז קרא ל-execve כדי להריץ תוכנה אחרת - האם fd 3 עדיין פתוח בתוכנה החדשה?

רמז: חשבו על איך הshell מממש את ls > output.txt. הshell עושה fork, מפנה את stdout לקובץ עם dup2, ואז קורא ל-execve כדי להריץ את ls. מה היה קורה אם execve היה סוגר את כל הfd-ים?