powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / взаимодействие через стандартные потоки ввода вывода
25 сообщений из 33, страница 1 из 2
взаимодействие через стандартные потоки ввода вывода
    #38066299
жук_ботан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как в с++ написать запуск консольной программы, что-бы взаимодействовать с ней через потоки ввода вывода?

В гугле нашел только сишную функцию "popen". А хотелось бы работать через потоки.
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38066320
уточню
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
работать должно на линуксе
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38066478
как тогда обернуть "FILE*" полученный функцией popen - в стандартный поток ввода с++?
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38066662
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так:

Код: plaintext
1.
$ ./жук_ботан.executabe | жук_ботан_фильтр1.executabe > жуко_ботанский_результат.txt
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38066683
жук_ботан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonКак-то так:

Код: plaintext
1.
$ ./жук_ботан.executabe | жук_ботан_фильтр1.executabe > жуко_ботанский_результат.txt



но, создавать временный файл - не желательно.

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

пока сделал через stregnstream. читаю туда содержимое (FILE *) полученного функцией popen.

а потом уже работаю со стримом. но считаю это решение - далеким от идеала.
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38066703
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКак-то так:

Код: plaintext
1.
$ ./жук_ботан.executabe | жук_ботан_фильтр1.executabe > жуко_ботанский_результат.txt


Без создания отчёта.

Код: plaintext
1.
$ ./жук_ботан_передатчик.executabe | жук_ботан_приёмник.executabe > /dev/null 2>/dev/null
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38066717
жук_ботан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonmaytonКак-то так:

Код: plaintext
1.
$ ./жук_ботан.executabe | жук_ботан_фильтр1.executabe > жуко_ботанский_результат.txt


Без создания отчёта.

Код: plaintext
1.
$ ./жук_ботан_передатчик.executabe | жук_ботан_приёмник.executabe > /dev/null 2>/dev/null



приемник не должен читать со стандартного потока ввода вывода. для него это кастомный поток.
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38066722
жук_ботан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

более того. приемник - родитель процесса передатчика.

пока я решение запилил. но жду более лучшего, более идиоматичного решения.
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38066748
убрал стрингстрим.

работаю с потоком ввода в си стиле.

просто думал, что в с++ должно быть норм решение на базе потоков. под виндой вроде есть, а вот под линухм - си стайл.
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38066770
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Твоя задача называется IPC.

Читай отсюдова
http://en.wikipedia.org/wiki/Inter-process_communication
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38067040
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТвоя задача называется IPC.

Читай отсюдова
http://en.wikipedia.org/wiki/Inter-process_communication та это я шарю.

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

з.ы. задачу то решил. но в чисто сишном стиле. думал просто, что есть с++-е подходы.
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38067101
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что вам мешает создать "консольное приложение" и спокойно использовать какие нибудь
сокеты или какой-нить D-Bus. И stder/stdout тоже можно использовать. В совокупности.

Я не вижу никаких ограничений.
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38067112
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧто вам мешает создать "консольное приложение" и спокойно использовать какие нибудь
сокеты или какой-нить D-Bus. И stder/stdout тоже можно использовать. В совокупности.

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

т.е. она не знает, кто, когда и откуда ее вызывает.

в данном случае, вопрос уже перешел от практического к теоретическому.
но тема взаимодействия все равно интересна.

вот в джаве например, данный функционал есть.
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38067120
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN,

Я так понимаю что о существовании stdin/stdout для C и cin/cout для С++ ты не знаешь и никогда не слышал?
Или тебе нужны какие-то особенные "стандартные потоки ввода вывода"?
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38067121
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ты Зик-Ботан? Не узнал тебя в платье, Керенский ты наш.
Честно говоря, тема(ы) наскучила(и) ибо "хотелось-бы" - это не постановка.
Ты уж определись что тебе надо. А хотелки .. они нарушают
течение сабжа и сбивают с толку.

А про pipes/stdin/stdout я уже всему форуму надоел хуже горькой
редки. И месяца не проходило чтобы не рассказал.
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38067196
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЯ так понимаю что о существовании stdin/stdout для C и cin/cout для С++ ты не знаешь и никогда не слышал?знаю и слышал.
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38067197
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭто ты Зик-Ботан? Не узнал тебя в платье, Керенский ты наш.
Честно говоря, тема(ы) наскучила(и) ибо "хотелось-бы" - это не постановка.
Ты уж определись что тебе надо. А хотелки .. они нарушают
течение сабжа и сбивают с толку.

А про pipes/stdin/stdout я уже всему форуму надоел хуже горькой
редки. И месяца не проходило чтобы не рассказал.неужели мой вопрос настолько не понятен.

я для решении своей проблемы(запуск программы, и взаимодействие с ней через ее стандартные потоки ввода вывода) заюзал popen, но это си стайл.

есть ли подобный механизм, но для с++-потоков?
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38067200
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ладно, приведу примеры кода.

вот джава:

Код: java
1.
2.
3.
4.
Process process = Runtime.getRuntime ().exec ("/bin/bash");
OutputStream stdin = process.getOutputStream ();
InputStream stderr = process.getErrorStream ();
InputStream stdout = process.getInputStream ();



вот си:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 FILE *fpipe;
   char *command="xwd -root | xwdtopnm | pnmtojpeg";
   char line[256];

 if ( !(fpipe = (FILE*)popen(command,"r")) )
{  // If fpipe is NULL
   perror("Problems with pipe");
   exit(1);
 }

while ( fgets( line, sizeof line, fpipe))
{
  //printf("%s", line);
  puts(line);
}
pclose(fpipe);



есть ли аналог для с++?
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38067202
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton"хотелось-бы" - это не постановка.не постановка. так, тема поговорить )
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38067222
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNя для решении своей проблемы(запуск программы, и взаимодействие с ней через ее стандартные потоки ввода вывода) заюзал popen, но это си стайл.

есть ли подобный механизм, но для с++-потоков?
Стандартного - нет.
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38067655
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можете посмотреть как реализовано в песочнице буста в библиотеке process
http://www.highscore.de/boost/process/
ну или в poco library
http://pocoproject.org/docs/Poco.Process.html#9431
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38068004
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pipe - это реальный объект файловой системы. И он может существовать отдельно
от пишушего и читающего процесса. Соотв. деструкция этого объекта лежит
как отдельная задача.

В сях чтобы получить доступ к stdin/stdout/stderr ЕМНИП можно использовать обычные
файловые функции fopen/open но в кач. дескриптора указать константы
(кажется это 0,1,2 соотвествтенно).
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38068009
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да это то понятно все..
у автора был вопросец, как это все красивенько в с++ обернуть..
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38068141
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNладно, приведу примеры кода.

вот джава:

Код: java
1.
2.
3.
4.
Process process = Runtime.getRuntime ().exec ("/bin/bash");
OutputStream stdin = process.getOutputStream ();
InputStream stderr = process.getErrorStream ();
InputStream stdout = process.getInputStream ();



есть ли аналог для с++?

Вроде так.
Код: plaintext
1.
2.
3.
FILE * stdin;
FILE * stout;
FILE * sterr;


Или
Код: plaintext
1.
2.
3.
extern ostream cout;
extern ostream cin;
extern ostream cerr;
...
Рейтинг: 0 / 0
взаимодействие через стандартные потоки ввода вывода
    #38068171
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жук_ботан,

popen -- это пайп, это если руками отрывать

на самом деле у любой С/С++ программы есть три потока:
-- стандартный ввод stdin
-- стандартный вывод stdout
-- стандартный вывод ошибок stderr

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

Эта идеология вообще говоря из UNIX-а, потом попала в POSIX, но операционки типа Windows это тоже поддерживают.
Т.е. это поддерживают практически все операционки.
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / взаимодействие через стандартные потоки ввода вывода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]