我使用CreateProcess和CreatePipe生成子进程,并在母子之间设置管道以进行通信。然后,我使用WriteFile写入孩子输入管道的写句柄,并使用ReadFile从孩子输出管道的读句柄读取。写完孩子的代码后,我在输入管道的写句柄上执行CloseHandle。
一切正常。但是,我不希望它像这样工作。我想给孩子喂一行,让孩子计算一些东西,然后将结果作为输出行输出,然后从母亲那里读取那行输出。然后向孩子输入另一行输入,依此类推。
不幸的是,当我跳过CloseHandle函数调用时,两个进程挂起,但没有任何反应。那么,如何重用管道并避免将其关闭?如果关闭它们,我必须再次创建子进程,对吗?我想这是一项繁重的操作,我真的想避免这种情况。使用管道是否有好的解决方案?我希望子进程无限期地运行,并且通讯是对话,在读写之间交替进行。
答案 0 :(得分:1)
我通过使用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