C ++ записывает данные в stdin и получает вывод из stdout - PullRequest
3 голосов
/ 21 декабря 2011

У меня есть одна программа, которая вызывает один tar .. что-то вроде popen ("tar -zcvf")

Я хочу написать на stdin ... и получить вывод .. что-то вроде tar -zcvf- / путь |tar - zxvf -

так что ... с одной стороны я инкапсулирую файлы из каталога, и они отправляются через стандартный вывод и пишут в обратном процессе .. и отправляют на стандартный вывод bash.

Я хочу выполнить этот конвейерный процесс ..

Прочитать одну папку / файл и отправить команду stdin для «извлечения» содержимого и чтения двоичного вывода.

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

Кто-то может мне помочь?

Я видел, что мне нужночтобы выполнить execl ... но все примеры, которые я нашел, было перенаправить стандартный вывод ребенка на мой.

Я сделаю что-то вроде этого:

LOOP.
1 Get block of data from stdin
2 Send to child program
3 get the output
4 Do something with the data (send back trough socket)
END_LOOP

OR
LOOP
1 Get block of data from stdin.
2 Send to child program.
END_LOOP
LOOP
1 Get block of data from child program
2 Do something with the data (send back trough socket)
END_LOOP

Ответы [ 2 ]

5 голосов
/ 21 декабря 2011

Вы не можете использовать popen для этого;popen всегда однонаправлено.Вы можете установить что-то в этом духе, используя pipe и fork напрямую (но это намного больше, чем popen).Если вы делаете, однако, вы должны быть очень, очень осторожны.Канал может содержать только ограниченное количество данных.Попробуйте написать больше, и запись будет ждать, пока освободится место.Таким образом, вы можете легко оказаться в ситуации, когда дочерний процесс ожидает, чтобы вы прочитали что-то в его выходном канале, чтобы создать больше места в канале, и ваш процесс ожидает, чтобы дочерний процесс прочитал что-то, так что будетбыть больше места в папе.Я делал это однажды в прошлом, но sort была одной из программ в цикле - и вы гарантированно, что sort не будет пытаться что-либо писать, пока не увидит конец файла на своем входе.

1 голос
/ 21 декабря 2011

std::cin и std::cout ваши друзья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...