Мне нужно выполнить внешнюю программу и поочередно получить доступ к ее стандартному и стандартному выводам, как и сам консольный терминал. Я использовал popen (), но он не обеспечивает двунаправленный канал. Использование pipe () и fork () также не работает в интерактивном режиме, поскольку канал доступа должен быть закрыт для доступа к каналу чтения.
Пожалуйста, помогите мне придумать это.
Вам нужно открыть два канала, один из которых вы подключаете к стандартному входу дочернего процесса, другой — к стандартному выходу. Вам, вероятно, также нужен какой-то способ мультиплексирования ввода / вывода в вашем процессе.
Другим вариантом может быть использование псевдотерминала, который даст вам двустороннюю связь с клиентским программным обеспечением, которое имеет псевдотерминал как канал ввода / вывода — хотя я не совсем уверен, какие именно шаги вы проходите, чтобы сделать это, я просто предлагаю это, поскольку я знаю другие программы, такие как xterm и ssh использует этот метод.
Тот же вопрос был задан ранее, и ответ в значительной степени тот, что я описал в первом абзаце:
одновременное чтение и запись
(Этот ответ включает в себя некоторый код, который выглядит хорошо!)
Вам придется использовать специальные средства ОС для создания отдельных каналов для stdout и stdin (и stderr, если хотите). На платформах POSIX вы можете использовать dup2()
поместить соответствующие концы труб в stdout и stdin (и stderr). Вам придется восстановить оригинальные дескрипторы после того, как вы fork()
, так что не забудьте сохранить их перед вашим местом новыми.
Трубы не работают таким образом. Вы можете использовать только канал чтения или записи.
Кроме того, стандартный ввод и вывод не могут быть одной и той же конечной точкой из-за направления. Это происходит от «работы трубопровода». Кто-то запускает и помещает что-то в стандартный вывод, который может использоваться кем-то еще в качестве стандартного ввода, и который снова помещает это в стандартный вывод для третьего …
Для двунаправленного общения вам нужно найти другой способ межпроцессного общения. Что это зависит от вашей реализации.