我的 Eclipse 项目是一个带有 makefile 项目的 C++。在 makefile 的末尾,有一个对可执行文件的调用,就像从终端一样。 (./myEXE)
这个程序应该在运行时接受来自终端的命令(这是一个使用 MPI 的物理模拟,可以在模拟运行时输入“stop”或“stats”或“stop”命令)。
输入(不是我的原始代码)是用 select()
(例如来自库 sys/types,this)来查看是否有任何可从标准输入读取的内容。 select() 的超时选项确保 MPI 有时间启动。尝试读取输入一段时间后,它将检查 MPI 工作负载是否有进展,如果没有,则会引发超时错误。
当我从终端调用 makefile 时,一切都很顺利。当试图从 Eclipse 运行时它坏了(shift+F9 等等...)
问题似乎在于 stdin 始终是可读的,因此在它有可能启动模拟之前检查 MPI - select()
在 <1ms 后返回。
因此,我的两个主要问题是:
- Eclipse 从哪里读取标准输入?
- 为什么它总是可读的?
附言由于程序是通过 makefile 中的 MPI 调用的,而不是直接从 Eclipse 中调用的,因此调试它有点棘手....
最佳答案
当 select
说 stdin
是可读的,你必须确保在再次调用 select
之前改变它的状态,否则它只会返回立即地。您的代码不会更改其状态,而只是再次调用 select
,导致它永远循环。
您应该如何修复它取决于 stdin
被关闭是否是您程序的致命条件。如果您的程序必须有一个有效的 stdin
才能继续,那么如果它在读取 stdin
时收到 EOF,它应该终止,而不仅仅是保持 select
盲目地。如果您的程序即使没有有效的 stdin
也能继续有用地运行,那么如果它关闭或出错,它应该将其从 select
集中删除。 (或停止调用 select
,具体取决于逻辑。)
但是你不能就这么不管,就当什么都没发生一样继续跑。
关于eclipse 中的 c++ makefile 项目 - select() 在 stdin 中返回速度异常快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25894360/