Возможен ли диалог через каналы между матерью и ребенком в Windows? - PullRequest
0 голосов
/ 15 октября 2018

Я использую CreateProcess и CreatePipe, чтобы порождать дочерний процесс и настраивать каналы между матерью и ребенком для связи.Затем я использую WriteFile для записи в дескриптор записи дочернего канала ввода и ReadFile для чтения из дескриптора чтения дочернего канала вывода.Закончив запись в дочернюю систему, я делаю CloseHandle для дескриптора записи входного канала.

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

К сожалению, когда я пропускаю вызов функции CloseHandle, два процесса зависают, и ничего не происходит.Так как я могу использовать трубы и не закрывать их?Если я закрою их, мне придется снова создать дочерний процесс, верно?Полагаю, это тяжелая операция, и я очень хочу этого избежать.Есть ли хорошее решение с использованием труб?Я хочу, чтобы дочерний процесс работал бесконечно, а общение было диалогом, чередующимся между записью и чтением.

1 Ответ

0 голосов
/ 15 октября 2018

Я решил это, используя ядро ​​Windows ReadFile и WriteFile вместо стандартных функций C в дочернем коде.Вот код ребенка:

HANDLE inp = (HANDLE)_get_osfhandle(0);
HANDLE out = (HANDLE)_get_osfhandle(1);
char buffer[0x400];
unsigned long N;
while (ReadFile(inp, buffer, sizeof(buffer), &N, NULL) && N > 0)
{
    WriteFile(out, buffer, N, &N, NULL);
}

А вот код матери:

process app("child.exe");
app.write(string("hello\n"));
app.read().print();
app.write(string("world\n"));
app.read().print();

Он печатает:

hello
world
...