Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java I/O完成端口和标准输出处理_Java_Jna_Iocp - Fatal编程技术网

Java I/O完成端口和标准输出处理

Java I/O完成端口和标准输出处理,java,jna,iocp,Java,Jna,Iocp,我正在为流程管理库使用I/O完成端口(是的,这是有原因的)。您可以找到我在这里所说内容的源代码:(看看第559行和第1137行——是的,该类需要重构和清理) 我正在启动一个子进程并使用命名管道(不是匿名管道b/c,我需要异步、重叠的ReadFile()/WriteFile())来处理子进程的stdout和stderr。这基本上是有效的。在一个测试中,我启动了1000个并发进程并监视它们的输出,确保它们发出正确的信息。通常情况下,1000个都能正常工作,或者998个都能正常工作,留下一对有问题的夫

我正在为流程管理库使用I/O完成端口(是的,这是有原因的)。您可以找到我在这里所说内容的源代码:(看看第559行和第1137行——是的,该类需要重构和清理)

我正在启动一个子进程并使用命名管道(不是匿名管道b/c,我需要异步、重叠的ReadFile()/WriteFile())来处理子进程的stdout和stderr。这基本上是有效的。在一个测试中,我启动了1000个并发进程并监视它们的输出,确保它们发出正确的信息。通常情况下,1000个都能正常工作,或者998个都能正常工作,留下一对有问题的夫妇

这两个进程显示并不是所有的消息都被接收到。我知道消息正在输出,但处理该进程的GetQueuedCompletionStatus()线程从读取返回,错误为管道断开

预期的行为是,OS(或C libs)将在进程退出时刷新标准输出缓冲区上的任何剩余字节。然后,我希望这些字节在出现断管错误之前排队到我的iocp。相反,这些字节似乎消失了,读取完成时出现了一个错误“断开的管道”——在我的代码中,这会导致它启动子进程的拆卸

我编写了一个简单的应用程序来测试和了解行为()。此应用程序禁用标准输出上的缓冲,因此应立即有效刷新所有写入。在我的测试中使用该程序会产生与启动“cmd.exe/c echo hi”相同的问题。无论如何,当进程退出时,应用程序(或操作系统)不应该刷新stdout上剩余的字节吗

源代码是Java的,使用直接映射的JNA,但是对于C/C++工程师来说应该很容易理解


谢谢你能提供的任何帮助

您确定非零ioSize时不会发生断管错误吗?如果ioSize不是零,那么您应该处理读取的数据,并注意文件现在已关闭

< >我的C++代码基本上忽略了<代码> ErrRoBROKEN管道> /COD>和ErrOrthHooLeTeEO< <代码>,只等待下一次读尝试失败,其中一个错误或当前读取完成零字节读取。所讨论的代码与文件和管道一起工作,我从未见过您在运行所描述的测试时所描述的问题