dup() ו-dup2() קריאת מערכת לינוקס
dup()
קריאת המערכת dup() יוצרת עותק של מתאר קובץ.
- הוא משתמש במתאר שאינו בשימוש בעל המספר הנמוך ביותר עבור המתאר החדש.
- אם העותק נוצר בהצלחה, ניתן להשתמש בתיאורי הקובץ המקורי וההעתקה לסירוגין.
- שניהם מתייחסים לאותו תיאור קובץ פתוח ובכך חולקים דגלים של קיזוז קבצים ומצב קובץ.
תַחבִּיר:
int dup(int oldfd);
oldfd: old file descriptor whose copy is to be created. C// C program to illustrate dup() #include#include #include int main () { // open() returns a file descriptor file_desc to a // the file 'dup.txt' here' int file_desc = open ( 'dup.txt' O_WRONLY | O_APPEND ); if ( file_desc < 0 ) printf ( 'Error opening the file n ' ); // dup() will create the copy of file_desc as the copy_desc // then both can be used interchangeably. int copy_desc = dup ( file_desc ); // write() will write the given string into the file // referred by the file descriptors write ( copy_desc 'This will be output to the file named dup.txt n ' 46 ); write ( file_desc 'This will also be output to the file named dup.txt n ' 51 ); return 0 ; } שימו לב שתוכנית זו לא תפעל במהדר המקוון מכיוון שהיא כוללת פתיחת קובץ וכתיבה עליו.
הֶסבֵּר:
ה-open() מחזיר מתאר קובץ file_desc לקובץ בשם 'dup.txt'. ניתן להשתמש ב-file_desc כדי לבצע פעולת קובץ כלשהי עם הקובץ 'dup.txt'. לאחר שימוש במערכת dup() הקריאה עותק של file_desc נוצר copy_desc. ניתן להשתמש בעותק הזה גם כדי לבצע פעולת קובץ עם אותו קובץ 'dup.txt'. לאחר שתי פעולות כתיבה אחת עם file_desc ואחרת עם copy_desc אותו קובץ נערך כלומר 'dup.txt'. לפני הפעלת הקוד תן לקובץ 'dup.txt' לפני פעולת הכתיבה להיות כפי שמוצג להלן:
![]()
לאחר הפעלת תוכנית C המוצגת למעלה, הקובץ 'dup.txt' הוא כפי שמוצג להלן:
![]()
dup2()
קריאת המערכת dup2() דומה ל-dup() אך ההבדל הבסיסי ביניהן הוא שבמקום להשתמש במתאר הקובץ שאינו בשימוש בעל המספר הנמוך ביותר הוא משתמש במספר המתאר שצוין על ידי המשתמש.
תַחבִּיר:
int dup2(int oldfd int newfd);
oldfd: old file descriptor
newfd new file descriptor which is used by dup2() to create a copy.נקודות חשובות:
- כלול את קובץ הכותרת unistd.h לשימוש ב-dup() ו-dup2() קריאת מערכת.
- אם המתאר newfd היה פתוח בעבר, הוא נסגר בשקט לפני שימוש חוזר.
- אם oldfd אינו מתאר קובץ חוקי, השיחה נכשלת ו-newfd לא נסגר.
- אם oldfd הוא מתאר קובץ חוקי ול-newfd יש אותו ערך כמו oldfd, אז dup2() לא עושה כלום ומחזיר את newfd.
שימוש מסובך בקריאה למערכת dup2():
כמו ב-dup2() במקום newfd ניתן לשים כל מתאר קובץ. להלן יישום C שבו נעשה שימוש במתאר הקובץ של פלט סטנדרטי (stdout). זה יוביל את כל הצהרות printf() להיכתב בקובץ שמפנה מתאר הקובץ הישן.
C // C program to illustrate dup2() #include #include #include #include int main () { int file_desc = open ( 'tricky.txt' O_WRONLY | O_APPEND ); // here the newfd is the file descriptor of stdout (i.e. 1) dup2 ( file_desc 1 ) ; // All the printf statements will be written in the file // 'tricky.txt' printf ( 'I will be printed in the file tricky.txt n ' ); return 0 ; }
ניתן לראות זאת באיור המוצג להלן: תן לקובץ 'tricky.txt' לפני פעולת dup2() להיות כפי שמוצג להלן:
לאחר הפעלת תוכנית C המוצגת למעלה, הקובץ 'tricky.txt' הוא כפי שמוצג להלן:
צור חידון