2009-04-17 2 views
2

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

+0

Связанные: [получить вывод команды в трубе, C для Linux] (http://stackoverflow.com/questions/219138/) – ephemient

ответ

5

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

+0

Великого. Я рассмотрел, как работают трубы, и это должно сделать трюк. –

+0

Просто для записи, если кто-то спотыкается об этом. Условие, основанное на типе [0], не совсем корректно. Нужно закрыть stdout/stdin перед dup2, чтобы это было возможно. Кроме того, труба является однонаправленной, а fds [1] является концом записи, поэтому для чтения следует использовать fds [0] в dup2. –

0

Вот простой пример, демонстрирующий использование 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; 
    } 
} 
Смежные вопросы