سؤال

أقوم بتطوير برنامج ينفذ برنامجا باستخدام ExecVP. يحتاج إلى التقاط نتائج عملية الطفل وتحليلها في العملية الرئيسية. يبدو أن هناك طريقة باستخدام الأنابيب المسماة، وتدخين. أحاول أن أطارد مثالا جيدا على هذا، ولكن حتى الآن لا حظ. إذا كان لدى أي شخص أي مؤشرات أو روابط و / أو اقتراحات حول هذا الأمر، فأنا أقدر ذلك كثيرا.

هل كانت مفيدة؟

المحلول

لا تحتاج أنابيب مسماة؛ الأنابيب غير المستسلة تعمل على ما يرام. في الواقع، في كثير من الأحيان يمكنك فقط استخدام popen بدلا من القيام pipe/fork/dup/exec نفسك. popen يعمل مثل هذا (على الرغم من الخاص بك libcمن المحتمل أن يكون لتنفيذ المزيد من التحقق من الأخطاء):

FILE *popen(const char *command, const char *type) {
    int fds[2];
    const char *argv[4] = {"/bin/sh", "-c", command};
    pipe(fds);
    if (fork() == 0) {
        close(fds[0]);
        dup2(type[0] == 'r' ? 0 : 1, fds[1]);
        close(fds[1]);
        execvp(argv[0], argv);
        exit(-1);
    }
    close(fds[1]);
    return fdopen(fds[0], type);
}

هذا يخلق أنبيبا لم يذكر اسمه، و forkس. في الطفل، يتم إعادة تناوله Stdout (أو Stdin) إلى طرف واحد من الأنبوب، ثم execS الطفل. يمكن للوالد ببساطة قراءة (أو الكتابة) من الطرف الآخر من الأنبوب.

نصائح أخرى

لا يمكنك فقط استخدام Popen ()؟

فيما يلي مثال بسيط يوضح استخدام Popen لتحقيق هدفك. فقط ضع شيئا أكثر إثارة للاهتمام من "صدى" كأمر :)

#include <stdio.h>

int main() 
{
    char buf[100];
    int i = 0;
    FILE *p = popen("echo \"Test\"","r");
    if (p != NULL )
    {
        while (!feof(p) && (i < 99) )
        {
            fread(&buf[i++],1,1,p);
        }
        buf[i] = 0;
        printf("%s",buf);
        pclose(p);
        return 0;
    }
    else
    {
        return -1;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top