0

我正在使用 select() 调用来检测程序主循环中是否存在输入。这使我使用原始文件描述符(0)而不是标准输入。

在这种模式下工作时,我注意到我的软件在开始时偶尔会丢失大量输入。我怀疑 stdin 在程序启动时会消耗其中的一些。有没有办法防止标准输入的这种行为或以其他方式获取整个输入数据?

只有在程序启动的那一刻,标准输入上的一些数据才能再现所描述的效果。我的可执行文件应该被用作 xinetd 服务,它总是在开始时有一些输入。

标准输入的读取方式如下:

Error processInput() {
  struct timeval ktimeout;
  int fd=fileno(stdin);
  int maxFd=fd+1;
  FD_ZERO(&fdset);
  FD_SET(fd, &fdset);
  ktimeout.tv_sec = 0;
  ktimeout.tv_usec = 1;
  int selectRv=-1;
  while ((selectRv=select(maxFd, &fdset, NULL, NULL, &ktimeout)) > 0) {
    int left=MAX_BUFFER_SIZE-position-1;
    assert(left>0);
    int bytesCount=read(fd, buffer+position, left);
    //Input processing goes here
  }
}
4

1 回答 1

1

不要将熟肉和生肉混在一起。尝试用等效的 fread() 调用替换 read() 调用。

很可能fileno(stdin)正在初始化 stdin 对象,导致它读取和缓冲一些输入。或者您可能已经调用了一些导致它初始化的东西(scanf()、getchar() 等...)。

于 2010-09-07T16:04:10.283 回答