كيفية استخدام وظيفة الأنبوب في لغة سي

How Use Pipe Function C Language



الأنبوب هو وسيلة للتواصل بين العمليات. تقوم إحدى العمليات بكتابة البيانات إلى الأنبوب ، بينما تقوم عملية أخرى بقراءة البيانات من الأنبوب. في هذه المقالة ، سنرى كيف يتم استخدام وظيفة الأنابيب () لتنفيذ المفهوم باستخدام لغة سي.

حول الأنابيب

في الأنبوب ، يتم الاحتفاظ بالبيانات بترتيب FIFO ، مما يعني كتابة البيانات إلى أحد طرفي الأنبوب بالتتابع وقراءة البيانات من طرف آخر من الأنبوب بنفس الترتيب التسلسلي.







إذا تمت قراءة أي عملية من الأنبوب ، ولكن لم تتم كتابة أي عملية أخرى إلى الأنبوب بعد ، فحينئذٍ تُرجع القراءة نهاية الملف. إذا كانت هناك عملية تريد الكتابة إلى أنبوب ، ولكن لا توجد عملية أخرى متصلة بالأنبوب للقراءة ، فهذه حالة خطأ ، ويولد الأنبوب إشارة SIGPIPE.



الملف الاساسي

#يشمل

بناء الجملة



intيضخ(intفيليدس[2])

الحجج

تأخذ هذه الدالة وسيطة واحدة ، مصفوفة من عددين صحيحين ( فيليدس ). ملفات [0] يستخدم للقراءة من الأنبوب ، و فيليديس [1] يستخدم للكتابة على الأنبوب. يجب إغلاق العملية التي تريد القراءة من الأنبوب فيليديس [1] ، ويجب إغلاق العملية التي تريد الكتابة إلى الأنبوب ملفات [0] . إذا لم يتم إغلاق الأطراف غير الضرورية للأنبوب بشكل صريح ، فلن يتم إرجاع نهاية الملف (EOF) أبدًا.





إرجاع القيم

عن النجاح ، فإن يضخ() تُرجع 0 ، في حالة الفشل ترجع الدالة -1.

من الناحية التصويرية ، يمكننا تمثيل ملف يضخ() تعمل على النحو التالي:



فيما يلي بعض الأمثلة التي توضح كيفية استخدام وظيفة الأنبوب في لغة C.

مثال 1

في هذا المثال ، سنرى كيف تعمل وظيفة الأنابيب. على الرغم من أن استخدام أنبوب في عملية واحدة ليس مفيدًا جدًا ، إلا أننا سنحصل على فكرة.

// example1.c
#يشمل
#يشمل
#يشمل
#يشمل

intالأساسية()
{
intن؛
intفيليدس[2]؛
شارمتعادل[1025]؛
شار *رسالة= 'مرحبا بالعالم!'؛

يضخ(فيليدس)؛
اكتب(فيليدس[1]ورسالةو سترلين (رسالة))؛

لو ((ن=اقرأ(فيليدس[0]ومتعادلو 1024 ) ) > = 0) {
متعادل[ن] = 0؛ // إنهاء السلسلة
printf ('قراءة٪ d بايت من توجيه الإخراج:'٪س'ن'ونومتعادل)؛
}
آخر
خوف ('اقرأ')؛
خروج (0)؛
}

هنا قمنا أولاً بإنشاء أنبوب باستخدام يضخ() وظيفة ثم كتابتها إلى الأنبوب باستخدام عاج [1] نهاية. بعد ذلك ، تمت قراءة البيانات باستخدام الطرف الآخر من الأنبوب ، وهو ملفات [0] . للقراءة والكتابة في الملف ، اعتدنا على ذلك اقرأ() و اكتب() المهام.

مثال 2

في هذا المثال ، سنرى كيف تتواصل عمليات الوالدين والطفل باستخدام الأنبوب.

// example2.c
#يشمل
#يشمل
#يشمل
#يشمل
#يشمل

intالأساسية()
{
intفيليدس[2]ون بايت؛
pid_t childpid؛
شارسلسلة[] = 'مرحبا بالعالم!ن'؛
شارreadbuffer[80]؛

يضخ(فيليدس)؛

لو((طفل=شوكة()) == -1)
{
خوف ('شوكة')؛
خروج (1)؛
}

لو(طفل== 0)
{
أغلق(فيليدس[0])؛// لا تحتاج العملية الفرعية إلى نهاية الأنبوب هذه

/ * إرسال 'سلسلة' عبر جانب الإخراج للأنبوب * /
اكتب(فيليدس[1]وسلسلةو ( سترلين (سلسلة)+1))؛
خروج (0)؛
}
آخر
{
/ * عملية الأصل تغلق جانب الإخراج من الأنبوب * /
أغلق(فيليدس[1])؛// لا تحتاج العملية الأصلية إلى نهاية الأنبوب هذه

/ * قراءة في سلسلة من الأنبوب * /
ن بايت=اقرأ(فيليدس[0]وreadbufferو حجم(readbuffer))؛
printf ('قراءة السلسلة:٪ s'وreadbuffer)؛
}

إرجاع(0)؛
}

أولاً ، تم إنشاء أنبوب واحد باستخدام وظيفة الأنابيب ثم تم تشعب عملية فرعية. بعد ذلك ، تغلق العملية الفرعية نهاية القراءة وتكتب على الأنبوب. تغلق العملية الرئيسية نهاية الكتابة وتقرأ من الأنبوب وتعرضه. هنا تدفق البيانات هو طريقة واحدة فقط من الطفل إلى الوالد.

استنتاج:

يضخ() هو استدعاء نظام قوي في Linux. في هذه المقالة ، رأينا تدفق البيانات في اتجاه واحد فقط ، وكتبت عملية واحدة ، وقراءة عملية أخرى ، مما أدى إلى إنشاء أنبوبين يمكننا تحقيق تدفق بيانات ثنائي الاتجاه أيضًا.