Как заставить этот канал работать в C ++? - PullRequest
2 голосов
/ 01 мая 2011

Я программирую оболочку на с ++. Он должен уметь передавать данные от одного к другому. Например, в Linux вы можете передать текстовый файл больше, выполнив cat textfile | more.

Моя функция передачи одной вещи в другую объявлена ​​так:

void pipeinput(string input, string output);

Я отправляю «cat textfile» в качестве входных данных и «more» в качестве выходных.

В примерах c ++, показывающих, как создавать каналы, используется fopen (). Что я отправляю в качестве ввода на fopen()? Я видел c ++ примеры конвейеризации с использованием dup2 и без предъявления иска dup2. Для чего используется dup2? Как узнать, нужно ли вам это использовать или нет?

Ответы [ 3 ]

4 голосов
/ 01 мая 2011

Для простого конвейера с двумя командами может оказаться достаточным предложенный вами интерфейс функций.Для общего случая N-ступенчатого конвейера, я не думаю, что он достаточно гибок.

Системный вызов pipe() используется для создания канала.В контексте, вы будете создавать одну трубу перед разветвлением.Один из двух процессов организует, чтобы конец записи канала стал его стандартным выводом (вероятно, с использованием dup2()), а затем закроет оба файловых дескриптора, первоначально возвращенных pipe().Затем он выполнит команду, которая пишет в канал (cat textfile в вашем примере).Другой процесс организует, чтобы код чтения канала стал его стандартным вводом (возможно, снова используя dup2()), а затем закроет оба дескриптора файла, первоначально возвращенного pipe().Затем он выполнит команду, которая читает из канала (more в вашем примере).

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

4 голосов
/ 01 мая 2011

Посмотрите на popen (3), это способ избежать execvp.

1 голос
/ 01 мая 2011

fopen() не используется для создания труб.Его можно использовать для открытия дескриптора файла, но в этом нет необходимости.

Трубы создаются с помощью вызова pipe(2), прежде чем завершить процесс.Подпроцесс имеет небольшое управление файловыми дескрипторами перед тем, как exec выполнить команду.См. Пример в документации pipe.

...