如何防止stdin流在程序启动时从关联的文件描述符中读取数据?

时间:2010-09-07 12:03:02

标签: c linux filestream file-descriptor

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

在这种模式下工作时,我注意到我的软件在开始时偶尔会丢失一大块输入。我怀疑stdin在程序启动时消耗了一些。有没有办法防止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
  }
}

1 个答案:

答案 0 :(得分:1)

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

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