Читать из трубы - PullRequest
       11

Читать из трубы

1 голос
/ 01 июля 2011

Мне нужно прочитать общий результат от C ТРУБЫ.Я мог бы просто создать огромный буфер и медленно его заполнять, но это кажется неэффективным и очень требовательным к памяти, поэтому мне интересно, есть ли у кого-нибудь идеи, как это сделать.

Вот мой код:

FILE* pipe = popen(command, "r");
if (!pipe)
{
    strcpy("FAIL", output);
    return -1;
}

char buffer[128];

while (!feof(pipe))
{
    if (fgets(buffer, 128, pipe) != NULL)
    {
        // should add buffer to main one here
    }
}

Любая помощь будет принята с благодарностью.

В C ++ я мог бы просто добавить ее в строку, но я не уверен, как мне это сделать в C.

Редактировать : я не знаю размер окончательного буфера.

Ответы [ 2 ]

4 голосов
/ 01 июля 2011

Я мог бы просто создать огромный буфер и медленно его заполнять, но это кажется неэффективным и очень требовательным к памяти

Если вам нужно, чтобы все было в памяти- это единственный путь.Вы можете кэшировать промежуточные результаты во временный файл, если сбор всех данных занимает много времени, но в конечном итоге вам придется заполнить этот огромный буфер памяти тем или иным способом.Промежуточное кэширование может быть либо на стороне отправителя, либо на стороне получателя, до вас.

Я не уверен, что могу следовать вашей дилемме ...

edit

После некоторых разъяснений выясняется, что проблема в том, что объем необходимой памяти не известен заранее.

Для этого realloc действительно является одним из способов обработки, используяфайл как метод временного кэширования позаботится об этом также без дополнительного снижения производительности памяти, которое вызывает realloc (но вместо этого вы получаете временное снижение производительности, потому что дисковый ввод-вывод намного медленнее).

2 голосов
/ 01 июля 2011

Вы можете начать с довольно небольшого размера буфера, а затем удваивать его всякий раз, когда у вас заканчивается свободное место. Это должно держать размер буфера в разумных пределах, но не потребует огромного количества перераспределений. (Из комментариев я понял, что вы заранее не знаете необходимый размер.) Я бы сказал, что realloc - это довольно безопасная ставка, и с этим методом вы будете вызывать ее только несколько раз.

...