Захват дочернего стандартного буфера в буфер

Я сейчас разрабатываю кроссплатформенный проект. В Windows у меня был класс, который запускал процесс / скрипт (используя командную строку), ждал его завершения и считывал все из его stdout / stderr в буфер. Затем я распечатал вывод на пользовательскую «консоль». Примечание. Это не было перенаправление дочернего стандартного вывода на родительский стандартный вывод, а просто канал от дочернего стандартного вывода к родительскому.

Я новичок в OSX / Unix-подобных API, но я могу понять канонический способ сделать что-то вроде этого, это раздвоение и соединение stdouts вместе. Тем не менее, я не хочу перенаправлять его на стандартный вывод, и я хотел бы захватить вывод .. Он должен работать примерно так (псевдокод, сходство с функциями unix чисто случайно):

class program
{
string name, cmdline;
string output;
program(char * name, char * cmdline)
: name(name), cmdline(cmdline) {};

int run()
{
// run program - spawn it as a new process
int pid = exec(name, cmdline);
// wait for it to finish
wait(pid);
char buf[size];
int n;
// read output of program's stdout
// keep appending data until there's nothing left to read
while (read(pid, buf, size, &n))
output.append(buf, n);
// return exit code of process
return getexitcode(pid);
}

const string & getOutput() { return output;  }
};

Как мне сделать это на OSX?

E:

Итак, я изучил соответствующие API, и кажется, что какое-то сочетание fork / exec неизбежно. Проблема в том, что мой процесс очень большой и разветвление действительно кажется плохой идеей (я вижу, что некоторые реализации Unix не могут этого сделать, если родительский процесс занимает 50% + системной памяти).

Разве я не могу избежать этой схемы в любом случае? Я вижу, что vfork () может быть возможным претендентом, поэтому, возможно, я мог бы попытаться имитировать функцию popen (), используя vfork. Но с другой стороны, большинство справочных страниц утверждают, что vfork вполне может быть просто fork ()

0

Решение

У вас есть вызов библиотеки, чтобы сделать это: popen. Он предоставит вам возвращаемое значение дескриптора файла, и вы можете прочитать этот дескриптор до конца. Это часть stdio, так что вы можете сделать это на OSX, но и на других системах. Просто не забудьте pclose () дескриптор.

 #include <stdio.h>

FILE *     popen(const char *command, const char *mode);

int    pclose(FILE *stream);

если вы хотите сохранить вывод без какого-либо перенаправления, единственное, о чем мы можем подумать, это использовать что-то вроде «tee» — команду, которая разбивает вывод в файл, но поддерживает свой собственный stdout. Это довольно легко реализовать в коде, но в этом случае это может не понадобиться.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector