我在这里有一个 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() 似乎就不再起作用了。