select()中的c++makefile项目在stdin中的返回速度异常快

c++ makefile project in select() returns strangely fast in stdin

本文关键字:返回 速度 异常 stdin 中的 c++makefile 项目 select      更新时间:2023-10-16

我的Eclipse项目是一个带有makefile的C++项目。在makefile结束后,会有一个对可执行文件的调用,就像从终端调用一样。(./myEXE)

该程序预计在运行时接受来自终端的命令(这是一个使用MPI的物理模拟,在模拟运行时可以输入"停止"、"统计"或"停止"命令)。

输入是用select()(例如,来自库sys/types)编写的(而不是我的原始代码),以查看stdin中是否有可读内容。select()的超时选项确保MPI有时间启动。在尝试读取输入一段时间后,它将检查MPI工作负载是否进展,如果没有,它将引发超时错误。

当我从终端调用makefile时,一切都像一个符咒。当尝试从Eclipse运行时(shift+F9等等…)被破坏

问题似乎是stdin总是可读的,因此在MPI有可能启动模拟之前对其进行检查——select()在<1毫秒。

因此,我的两个主要问题是:

  • Eclipse从哪里读取stdin
  • 为什么它总是可读的

附言:由于该程序是通过makefile中的MPI调用的,而不是直接从Eclipse调用的,因此调试所有程序有点棘手。。。。

select表示stdin可读时,必须确保在再次调用select之前更改其状态,否则它将立即返回。您的代码不会更改其状态,而是再次调用select,使其永远循环。

应该如何修复它取决于stdin关闭是否是程序的致命条件。如果你的程序必须有一个工作的stdin才能继续,那么如果它在读取stdin时得到EOF,它应该终止,而不仅仅是让select盲目地运行。如果您的程序即使没有工作的stdin也能继续有效地运行,那么如果它关闭或出错,它应该将其从select集合中删除。(或者根据逻辑停止调用select。)

但你不能无视这个案子,若无其事地继续跑。