使用getchar()和select()从非阻塞IO获取多个字符时发生奇怪的C行为

时间:2014-04-02 14:20:10

标签: c unix select io getchar

我在unix非阻塞IO编程方面有一些经验。我把一个select()和getchar()函数放在一个无限循环中,期望如果我输入多个字符到stdin并按输入,所有这些字符将由{{逐个打印出来“ 1}}。但是,它只是我输入的第一个字符被打印,其他字符在我再次输入字符之前没有打印。

这是我的代码:

printf()

结果是:

int main () {
  fd_set readFdSet;
  struct timeval timeout;
  int selectResult;
  char c;
  while(1) {
    FD_ZERO(&readFdSet);
    FD_SET(fileno(stdin), &readFdSet);
    timeout.tv_sec = 0;
    timeout.tv_usec = 0;
    selectResult = select(fileno(stdin)+1, &readFdSet,
                           NULL, NULL, &timeout);

    if (FD_ISSET(fileno(stdin), &readFdSet)) {
      c = getchar();
      printf("getchar: %c\n", c);
    } 
  }
}

1 个答案:

答案 0 :(得分:4)

这可能是因为您正在混合使用缓冲和非缓冲的标准输入函数。 Select应与readwrite结合使用。在您的情况下,请使用以下内容替换c = getchar();

read(fileno(stdin), &c, 1);

另请注意,fileno(stdin)最好被称为STDIN_FILENO