logo

dup() وdup2() استدعاء نظام Linux

مكرر ()

يقوم استدعاء النظام 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 filen');    // 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.txtn' 46);    write(file_desc'This will also be output to the file named dup.txtn' 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() استدعاء نظام Linux

بعد تشغيل برنامج C الموضح أعلاه، يظهر الملف "dup.txt" كما هو موضح أدناه:

dup() وdup2() استدعاء نظام Linux

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.txtn');   return 0; } 

يمكن ملاحظة ذلك في الشكل الموضح أدناه: دع الملف 'tricky.txt' قبل عملية dup2() يكون كما هو موضح أدناه:

dup() وdup2() استدعاء نظام Linux

بعد تشغيل برنامج C الموضح أعلاه، يظهر الملف "tricky.txt" كما هو موضح أدناه:

dup() وdup2() استدعاء نظام Linux إنشاء اختبار