Чтение и запись в один и тот же безымянный канал (boost :: process :: pstream) в дочернем процессе - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь реализовать чтение и запись в дочернем процессе из / в один и тот же канал. Вместо канала я использую boost::process::pstream и перенаправляю stdin и stdout в дочернем процессе в этот поток.

Простой пример. Я отправляю сообщение из основного процесса дочернему, читаю его из дочернего процесса и отправляю обратно в основной. Проблема в том, что я получаю мусор (пустую строку) в основном процессе обратно из дочернего процесса. Что я делаю не так?

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

int main(int argc, char **argv) {
    if (argc == 1)
    {
        bp::pstream p;
        p << "What?" << endl;
        bp::child c(argv[0], "OPTIONAL", bp::std_in=p, 
            bp::std_out=p, bp::std_err=stderr);
        c.wait();

        string x;
        getline(p, x);
        cout << "Received from child process:" << x << endl;
        system("pause");
    }
    else {
        string x;
        getline(cin, x);
        cerr << "Received from main process:" << x << endl;
        cout << x << endl;
    }
}

Вывод следующий:

Received from main process:What?
Received from child process:
Press any key to continue . . .
...