我在这里有一个 java 应用程序,它通过 java.lang.Process API 启动一个 C++ 应用程序,然后尝试通过标准输入管道向它发送命令:
process.getOutputStream().write("foo\n");
process.getOutputStream().flush();
在 C++ 端,有一个循环正在运行,它检查标准输入中的输入,如果有的话,它会读取它。不幸的是,检查总是返回 0,因此它从不尝试读取。如果我删除检查,那么它会突然开始查看命令并处理它们。这是在linux上。
从标准输入检查和读取的 C++ 应用程序代码是这样的:
fd_set fds;
FD_ZERO ( &fds );
FD_SET (0, &fds);
结构时间值电视;
tv.tv_sec = 0;
tv.tv_usec = 0;
if( 选择 ( 1, &fds, 0, 0, &tv ) > 0 ) {
字符缓冲区[16384];
buf[16383] = '\0';
if ( fgets ( buf, sizeof ( buf ) - 1, stdin ) == 0 )
返回;
}
正如我所说,删除 if 子句使其工作,但当然这不是很好,因为它周围的循环还做了一些其他事情。有人知道我在这里做错了什么吗?
更新:同时,我能够用两个非常小的示例应用程序重现该问题。问题似乎与这里的 Qt 框架有关,只要我创建了框架所需的 QCoreApplication 实例,stdin 的 select() 似乎就不再起作用了。