Читайте о UNIX фильтрах или здесь
Фильтры Unix взаимодействуют на стандартном входе и стандартном выходе. То есть стандартный вывод первого процесса поступает на стандартный ввод второго процесса.
Стандартный ввод и вывод - это, по существу, двоичные / текстовые потоки
Этот метод может быть связан. Оболочка обычно является стороной, которая управляет
- среда
- запуск, мониторинг и выход процессов
- взаимосвязи
Так
0. пользователь дает команду, например, Ls
1. оболочка находит команду, создает новый процесс, подключает стандартный вывод с терминала и стандартный вывод с терминала,
2. ждет выполнения программы
3. устанавливает среду с результатом подпроцесса
Если вы говорите, что у вас есть вывод ls в векторе, я боюсь, что вы не очень близки к программированию оболочки в истинном стиле
Если вы хотите создать оболочку без всех особенностей управления процессами, каналов, перенаправлений и прочего, наиболее полезным средством будут std :: istream и std :: ostream (или библиотека Boost IOStreams).
Очень очень простая (действительно очень глупая) версия grep может выглядеть так:
#include <iostream>
#include <string>
static bool is_match(const std::string& text, const std::string& pattern)
{
// FIXME TODO use actual (posix?) regex, boost regex, regex++ or whatnot
return std::string::npos != text.find(pattern);
}
int main(int argc, const char* argv[])
{
switch(argc)
{
case 0: case 1:
std::cerr << "specify the pattern" << std::endl;
return 254;
case 2:
break;
default:
std::cerr << "not implemented" << std::endl;
return 255;
}
const std::string pattern(argv[1]);
std::string line;
while (std::getline(std::cin, line))
{
if (is_match(line, argv[1]))
std::cout << line << std::endl;
}
return 0;
}
Существуют лучшие примеры Например. здесь но, судя по вопросу, я подумал, что это был следующий информативный шаг по дороге;)
Также обратите внимание, что библиотека Boost IOstreams, похоже, содержит встроенную поддержку конвейеров