cerr(c++)如何在Stdout(Java)中出现

How can cerr (c++) turn up in Stdout (Java)?

本文关键字:Java Stdout c++ cerr      更新时间:2023-10-16

我有一个Java应用程序,它通过JNI调用用C++编写的DLL,然后这个DLL动态加载另一个DLL。在某些情况下,用C++编写到cerr的消息会出现在Java部分的Stdout流中的某些计算机上。C++部分和Java部分中都没有任何标准流(cerr、cout、Stdout、Sterr等)的显式重定向。

这怎么会发生?如何确保C++层的cerr流最终在Java层的Stderr流中?

JVM在所有情况下都是相同的,

JRE版本:6.0_27-b07,Java虚拟机:Java HotSpot(TM)客户端虚拟机(20.2-b06混合模式windows-x86)

要直接回答您的问题,std::cerr只能在共享相同描述符的情况下显示在System.out中。

如果它真的发生在某些计算机上,而不是其他计算机上,我会怀疑默认System.out和System.err的Java实现存在差异。您没有指示相同的Java安装,只是指示不同的计算机。Java对其默认输出流实现没有任何保证。

现在,由于每一侧的缓冲区和文件描述符彼此不协调,因此只有两种可能性:

1) 您可以访问DLL源,并可以更改所有I/O以利用传入的System.out/err Java流。

2) 你没有。在这一点上,即使你显然通过合作冲洗成功了,你也无法证明你的破解似乎有效的实验证据之外的正确性。实验很有可能不会发现缓冲区完全满、空或共享相同文件描述符的情况。

希望你能选择#1。