تشغيل برنامج خارجي من C ومعالجة مخرجاته

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

التحدي: تنفيذ أداة والتقاط مخرجاتها

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

نظرة عامة على الحل: استخدام popen()

للبيئات الشبيهة بنظام UNIX، الدالة التي يمكن استخدامها هي popen(). تمكّنك هذه الدالة من تشغيل برنامج وقراءة مخرجاته مباشرة في كود C الخاص بك. إليك فهم أساسي لكيفية عمل popen():

ما هي popen()؟

popen() تعني “فتح أنبوب”. تقوم بإنشاء أنبوب، وتقوم بتفرع عملية جديدة، وتستدعي الصدفة لتنفيذ الأمر الذي تحدده. هذا يسمح لك بالتقاط المخرجات كما لو كنت تقرأ من ملف.

الاستخدام الأساسي لـ popen()

الصياغة الأساسية لاستخدام popen() هي كما يلي:

FILE *popen(const char *command, const char *type);
  • command هو سلسلة تحتوي على الأمر الذي تريد تشغيله.
  • type يحدد كيفية الوصول إلى المخرجات (“r” للقراءة و “w” للكتابة). لحالتك، يجب عليك استخدام “r”.

مثال على الكود

إليك مثال بسيط عن كيفية تنفيذ استدعاء لأداة خارجية وقراءة مخرجاتها:

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;
    char buffer[128];

    // تشغيل الأمر
    fp = popen("your_utility_command_here", "r");
    if (fp == NULL) {
        perror("خطأ في popen");
        return -1;
    }

    // قراءة المخرجات سطرًا بسطر
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("%s", buffer); // معالجة المخرجات حسب الحاجة
    }

    // إغلاق العملية
    pclose(fp);
    return 0;
}

الخطوات الأساسية في الكود

  1. فتح أنبوب: استدعاء popen() لتنفيذ الأمر والحصول على مؤشر ملف fp.
  2. معالجة المخرجات: استخدام fgets() في حلقة لقراءة كل سطر من المخرجات حتى لا يتبقى شيء.
  3. معالجة المخرجات: يمكنك طباعة المخرجات أو تخزينها لمزيد من المعالجة.
  4. إغلاق الأنبوب: استخدم دائمًا pclose() لتحرير الموارد بعد الانتهاء.

اعتبارات للمنصات المختلفة

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

الخلاصة

باختصار، يمكن التقاط مخرجات برنامج خارجي داخل تطبيق C بكفاءة باستخدام دالة popen(). هذه الطريقة قوية بشكل خاص لتنفيذ الأدوات التي تنتج مخرجات نصية. من خلال اتباع الخطوات الموضحة، يمكنك بسهولة دمج الأوامر الخارجية في تطبيقاتك، سواء كنت تعمل على ماك، ويندوز، أو لينكس.

لا تتردد في توسيع معرفتك من خلال تجربة أوامر مختلفة ومعالجة مخرجاتها بطرق متنوعة تناسب احتياجات تطبيقك!