Как захватить вывод execvp - PullRequest
3 голосов
/ 18 апреля 2009

Я разрабатываю программу, которая выполняет программу, используя execvp. Необходимо зафиксировать результаты дочернего процесса и проанализировать их в основном процессе. Кажется, есть способ, используя именованные каналы и обман. Я пытаюсь найти хороший пример этого, но пока что безуспешно. Если у кого-то есть какие-либо указатели, ссылки и / или предложения по этому поводу, я был бы очень признателен.

Ответы [ 3 ]

6 голосов
/ 18 апреля 2009

Вам не нужны именованные каналы; безымянные трубы работают просто отлично. На самом деле, часто вы можете просто использовать 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 s. В дочернем объекте он присоединяет стандартный вывод (или стандартный ввод) к одному концу канала, а затем exec дочерний. Родитель может просто читать (или писать) с другого конца канала.

2 голосов
/ 18 апреля 2009

Разве вы не можете просто использовать popen ()?

0 голосов
/ 17 августа 2011

Вот простой пример, который демонстрирует использование popen для достижения вашей цели. Просто введите в качестве команды что-то более интересное, чем "echo":)

#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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...