dup() ו-dup2() קריאת מערכת לינוקס

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' לפני פעולת הכתיבה להיות כפי שמוצג להלן:

dup() ו-dup2() קריאת מערכת לינוקס

לאחר הפעלת תוכנית C המוצגת למעלה, הקובץ 'dup.txt' הוא כפי שמוצג להלן:

dup() ו-dup2() קריאת מערכת לינוקס

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() להיות כפי שמוצג להלן:

dup() ו-dup2() קריאת מערכת לינוקס

לאחר הפעלת תוכנית C המוצגת למעלה, הקובץ 'tricky.txt' הוא כפי שמוצג להלן:

dup() ו-dup2() קריאת מערכת לינוקס צור חידון