Как передать интерактивную оболочку удаленной программы в стандартный вывод работающей программы на C++, которая запустиC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как передать интерактивную оболочку удаленной программы в стандартный вывод работающей программы на C++, которая запусти

Сообщение Anonymous »

У меня есть программа на C++ (скажем, процесс P1), которая в ходе выполнения порождает новый процесс P2 на удаленной машине с помощью средства запуска, такого как LSF. P2 имеет интерактивную оболочку (может быть Python). Я хочу, чтобы пользователь на P1 некоторое время использовал эту интерактивную оболочку P2, а затем вышел из P2, когда закончит. P1 продолжается отсюда и в будущем может порождать другие интерактивные оболочки. При этом P1 либо продолжал работать в фоновом режиме, либо был заблокирован (на данный момент не имеет значения). Необходимо, чтобы локальная программа, такая как P1, запускала только P2, поскольку она может запускать другие процессы в зависимости от определенных условий. Кроме того, P1 может перезапустить P2 в случае сбоя P2. Все процессы выполняются в среде Linux.

Запуск bsub -Ip P2 с помощью popen не передает оболочку P2 в стандартный вывод P1. Это просто показывает, что программа была запущена на определенном компьютере.

Если потоковая передача невозможна, существует ли альтернативный способ справиться с таким сценарием.
В оболочке Linux, чтобы запустить интерактивную оболочку Python на удаленном компьютере с помощью bsub, я использую следующее:

Код: Выделить всё

$ bsub -Ip python
Job  is submitted to default queue .


Python 3.12.0 (main, Nov 26 2023, 21:52:55) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hi")
Hi
>>>
Я хочу получить аналогичный интерфейс из своей программы на C++. Вот простая программа, показывающая, что я хочу сделать.

Код: Выделить всё

//  Program for P1
#include 

int main()
{
/* do P1 work */

char buffer[128];
FILE* pipe = popen("bsub -Ip python", "r");   // P2 is python here.
if (!pipe) {
return 0;
}
std::string result = "";
while (!feof(pipe)) {
if (fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
pclose(pipe);

/* continue P1 work */
return 0;
}
При запуске этой программы я не вижу оболочку Python на стандартном выводе. Это ожидаемо, поскольку я не делал ничего для его перенаправления.

Код: Выделить всё

$ ./a.out



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

Подробнее здесь: https://stackoverflow.com/questions/786 ... -running-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»