是否可以通过Windows上母子进程之间的管道进行对话?

是否可以通过Windows上母子进程之间的管道进行对话?,windows,process,pipe,Windows,Process,Pipe,我使用CreateProcess和CreatePipe生成子进程,并在母进程和子进程之间设置管道,以便通过它们进行通信。然后我使用WriteFile写入子输入管道的写入句柄,使用ReadFile读取子输出管道的读取句柄。完成对孩子的写入后,我对输入管道的写入句柄执行CloseHandle 这一切都很好。然而,我不希望它像这样工作。我想给孩子输入一行,让孩子计算一些东西,并将结果作为一行输出输出,然后从母亲那里读取这行输出。然后将另一行输入馈送给孩子,依此类推 不幸的是,当我跳过CloseHand

我使用CreateProcess和CreatePipe生成子进程,并在母进程和子进程之间设置管道,以便通过它们进行通信。然后我使用WriteFile写入子输入管道的写入句柄,使用ReadFile读取子输出管道的读取句柄。完成对孩子的写入后,我对输入管道的写入句柄执行CloseHandle

这一切都很好。然而,我不希望它像这样工作。我想给孩子输入一行,让孩子计算一些东西,并将结果作为一行输出输出,然后从母亲那里读取这行输出。然后将另一行输入馈送给孩子,依此类推


不幸的是,当我跳过CloseHandle函数调用时,两个进程挂起,什么也没有发生。那么,如何重复使用这些管道并避免关闭它们呢?如果我关闭它们,我必须再次创建子进程,对吗?我想这是一项繁重的工作,我真的想避免这种情况。使用管道有好的解决方案吗?我希望子进程无限期地运行,通信是一种对话,在写和读之间交替进行

我通过在子代码中使用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

可能对单个管道对象执行任何读/写计数。甚至不需要创建两个单独的管道。单个(如果读/写异步)足够这取决于子进程的设计。在管道关闭之前,如果它正在同步读取stdin,您将无能为力。如果它正在缓冲stdout,您可以将多个操作排队到子级的stdin,以获得足够的结果来填充stdout缓冲区并开始将数据刷新到管道。但是,如果命令是相互依赖的,则无法执行此操作。在这种情况下,请查找一个命令行选项或环境变量设置,该选项或设置将禁用对子项的stdout进行缓冲。@eryksun子项一次读取一行输入,计算并输出一行。我无法将命令排队到输入管道;我得一次喂一只。我认为管道只是一个具有写和读访问权限(由句柄表示)的缓冲区。这个名字有误导性。写入标准输出的子对象正在写入输出管道缓冲区。谈到无缓冲管道没有任何意义。@Henrik4,C标准I/O
FILE
streams默认为磁盘和管道文件缓冲。子进程是否使用C/C++标准I/O?@eryksun是的,它们使用C/C++标准I/O,但实际上这并不重要,因为是母亲用她的管道强制执行I/O解决方案。是的,子级使用标准C流I/O。可能它必须使用ReadFile和WriteFile才能使对话正常工作。