استدعاء نظام Linux Popen في C

Astd A Nzam Linux Popen Fy C



' ستنفذ وظيفة popen () الأمر الذي قدمه أمر السلسلة. يجب أن ترجع الوظيفة مؤشرًا إلى التدفق الذي يتم استخدامه للقراءة أو الكتابة إلى الأنبوب أثناء إنشاء أنبوب بين تطبيق الاستدعاء والأمر المنفذ. تتوفر وظيفة Popen في المكتبة القياسية لوظيفة الإدخال / الإخراج وتولد عملية ثانية لتشغيل أمر طرفي. المرحلة المفتوحة من popen () هي نفس المرحلة المفتوحة في وظيفة fopen (). تبدأ وظيفة popen () العملية عن طريق التفرع وإنشاء أنبوب وتنفيذ الغلاف. نظرًا لأن الأنبوب أحادي الاتجاه افتراضيًا ؛ نتيجة لذلك ، يكون الدفق للقراءة فقط أو للكتابة فقط. في التنفيذ الناجح لوظيفة popen () ، يتم الحصول على دفق مفتوح يتم استخدامه للقراءة والكتابة للأنبوب. '

مثال 1

باستخدام برنامج المثال التالي ، سنقرأ الملفات الموجودة في الدليل أو المجلد الحالي باستخدام استدعاء نظام popen. أولاً ، أدخلنا ملف الرأس stdio.h لمكتبة C القياسية. بعد ذلك ، لدينا وظيفة برنامج int main () حيث نشرنا وظيفة popen. قبل ذلك ، أنشأنا متغير المؤشر 'FileOpen' من الفئة 'FILE'. يشير متغير المؤشر للملف إلى البايت التالي للقراءة أو الكتابة.







بعد ذلك ، قمنا بتعيين قيمة الحد للحرف ليتم قراءتها. ثم قام المتغير 'FileOpen' باستدعاء الوظيفة 'popen'. تأخذ وظيفة 'popen' الأمر 'ls -l' في نظام Linux ، والذي سيسرد جميع ملفات الدليل الحالي. علاوة على ذلك ، قمنا بإدخال المعلمة 'r' في وظيفة popen ، والتي تشير إلى وضع القراءة.



هنا ، قمنا بتوصيل عملية قراءة الملفات باستخدام وظيفة popen. بعد ذلك ، قمنا بمعالجة الأنبوب الذي تم إنشاؤه باستخدام حلقة while. تستخدم حلقة while التوابع fgets التي تأخذ المتغيرات 'line' و 'sizeof the line' و 'FileOpen'. يقرأ fgets عملية الأنابيب ويخزنها في رمز السلسلة '٪ s'. يسمى هذا الرمز الخاص داخل عملية printf جنبًا إلى جنب مع وسيطة 'line'. بمجرد إنشاء الأنبوب المعالج ، باستخدام الوظيفة المغلقة ، يمكن إغلاق عملية الأنابيب كما تم نشرها في نهاية البرنامج أدناه.



# تضمين


انت مين ( )

{

ملف * فتح الملف؛

خط شار [ 130 ] ؛


FileOpen = popen ( 'ls -l' و 'ص' ) ؛

في حين ( fgets ( الخط ، حجم الخط ، FileOpen ) )

{

printf ( '٪س' ، خط ) ؛

}

pclose ( فتح الملف ) ؛

}





قامت وظيفة popen في برنامج C بتشكيل العملية المذكورة أعلاه ثم إنشاء الأنبوب. الآن ، قمنا بتنفيذ الأنبوب المعالج للتيار في الغلاف باستخدام الأمر C compilation. قام الإخراج بإدراج جميع الملفات الموجودة في الدليل 'Home' حيث قمنا بتنفيذ البرنامج في هذا الدليل.



مثال 2

في برنامج popen السابق ، لدينا عرض توضيحي بسيط لوظيفة برنامج Popen المستخدم لتدفق عملية دفق قراءة الملفات. الآن ، أخذنا مثالًا آخر على وظيفة popen حيث قمنا بتدوير العملية باستخدام وضع الكتابة. دعونا ننظر في البرنامج مع الوظيفة الرئيسية. لقد أنشأنا متغير مؤشر الملف داخل الوظيفة الرئيسية باسم 'file'. يتم نشر مؤشر الملف مع وظيفة popen.

تأخذ وظيفة popen الأمر 'cat' و 'w' لوضع الكتابة. هنا ، تتم قراءة كل وسيطة ملف بشكل تسلسلي وإرسالها إلى الإخراج القياسي بواسطة الأمر cat. في جسم الحلقة for ، استخدمنا وظيفة fprintf لطباعة قيم العد العددي كما حددنا الرمز '٪ d'. ثم أغلقت ، عملية الأنابيب المنبثقة مع استدعاء النظام pclose.

# تضمين


انت مين ( int argc ، char ** أرجف ) {

ملف * ملف = بوبين ( 'قطة' و 'في' ) ؛

int x = 0 ؛


إلى عن على ( x = 0 ؛ x < 5 ؛ x ++ ) {


fprintf ( ملف و 'عدتي =٪ d ' ، س ) ؛
}

pclose ( ملف ) ؛

إرجاع 0 ؛

}

عندما قمنا بتنفيذ العملية التي تم إنشاؤها أعلاه ، قامت بطباعة قيم العد بالطريقة التالية.

مثال 3

الآن ، لدينا برنامج آخر ينقل بيانات عملية إلى عملية أخرى. سنفعل هذا بالأنبوب من وظيفة popen. لقد قمنا بتنفيذ البرنامج باستخدام المكتبات القياسية لـ C. ثم ، لدينا وظيفة رئيسية int لنشر البرنامج. هنا ، حددنا السلسلة في وظيفة sprintf مع وسيطة 'المخزن المؤقت'. تحافظ الدالة sprintf () على النتيجة في المخزن المؤقت char الذي يوفره sprintf بدلاً من إرسالها إلى الموجه.

بعد ذلك ، أطلقنا على وظيفة popen داخل متغير 'read'. هناك ، لدينا عمليتان داخل دالة popen. 'wc -c' هي العملية الأولى التي يتم استخدامها لحساب الأحرف المتوفرة ، والعملية الثانية هي 'w' ، والتي تشير إلى أن الأنبوب مفتوح في وضع الكتابة. بعد ذلك ، لدينا وظيفة 'fwrite' التي تستخدم الأنبوب لكتابة البيانات. سيتم استقبال البيانات بواسطة 'wc' ، ثم عد الحرف وعرضها في الغلاف.

# تضمين

# تضمين

# تضمين

# تضمين

انت مين ( )

{

ملف * قرأ ؛

شار العازلة [ خمسون ] ؛

سبرينتف ( متعادل، 'اتصال نظام Linux' ) ؛

قرأ = بوبين ( 'wc -c' و 'في' ) ؛

fwrite ( عازلة ، sizeof ( شار ) ، strlen ( متعادل ) و قرأ ) ؛

pclose ( قرأ ) ؛

}

الأحرف المعروضة في المطالبة هي '17' لأن السلسلة التي حددناها أعلاه تحتوي على '17' حرفًا. تقرأ عملية 'wc -c' هذه الأحرف وتطبعها كمخرجات.

مثال 4

المثال أعلاه من popen يرسل البيانات من عملية إلى أخرى. هنا ، سوف نتلقى البيانات من عملية إلى عملية أخرى عبر أنبوب. تتمثل الوظيفة الرئيسية للبرنامج في إنشاء المخزن المؤقت الذي يأخذ قيم '50'. بعد ذلك ، أنشأنا المتغير 'r' ، حيث أنشأت وظيفة popen العملية. تُستخدم عملية 'ls' لسرد ملفات الدليل ، وعملية 'r' لقراءة البيانات من الأنبوب. تنقل عملية 'ls' البيانات إلى عملية 'r' لقراءتها. بعد ذلك ، لدينا وظيفة fread ، التي تقرأ البيانات وتخزن البيانات في المخزن المؤقت. بعد ذلك ، ستقوم جملة الطباعة بطباعة البيانات المخزنة في المخزن المؤقت.

# تضمين

# تضمين

# تضمين

# تضمين

انت مين ( )

{

ملف * ص ؛

شار العازلة [ خمسون ] ؛


ص = بوبين ( 'ls' و 'ص' ) ؛

fread ( متعادل، 1 و 25 ، ص ) ؛


printf ( '٪س ' ، متعادل ) ؛

pclose ( ص ) ؛

}

هنا يتم عرض '50' حرفًا فقط من الملفات الموجودة من دليل العمل. لذلك ، سيتكون الإخراج من 50 حرفًا فقط.

استنتاج

لقد قدمنا ​​عرضًا تفصيليًا لمكالمات نظام Linux popen بلغة C. لقد قمنا بتنفيذ أربعة أمثلة حيث قمنا بنشر وظيفة popen. تقوم وظيفة popen بإرجاع تيار الأنبوب وفقًا للوضع الذي قمنا بتعيينه. في الأمثلة ، استخدمنا وضعي القراءة والكتابة مع وظائف معالجة الملفات fread و fwrite. لقد استخدمنا اسم البرنامج في وظيفة popen () كوسيطة أولى له. الوسيطة الثانية هي ملف 'r' كما هو مقروء أو 'w' كوضع كتابة.