代码之家  ›  专栏  ›  技术社区  ›  sdaau

LinuxC选择:管道回音输入工作,但从键盘读取不工作?

  •  0
  • sdaau  · 技术社区  · 15 年前

    我在试着理解 http://beej.us/guide/bgnet/examples/select.c (以下为参考)。我正在做:

    :~$ cat /etc/issue

    Ubuntu 10.04 LTS \n \l
    :~$ gcc --version
    gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
    
    :~$ wget http://beej.us/guide/bgnet/examples/select.c
    :~$ gcc select.c -o select
    
    :~$ echo "ff" | ./select 
    A key was pressed!
    
    :~$ ./select 
    TYPINGTYTimed out.
    

    因此,select程序显然可以将一个回音管道识别为输入;但它不能识别终端上的按键。这是为什么?是否可以使用某种重定向(我猜,类似于屏幕如何将键盘输入“重定向”到串行会话),以便识别终端中的实际按键?

    谢谢, 干杯!

    选择C:

    /* ** select.c -- a select() demo */

    #include <stdio.h>
    #include <sys/time.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    #define STDIN 0  // file descriptor for standard input
    
    int main(void)
    {
     struct timeval tv;
     fd_set readfds;
    
     tv.tv_sec = 2;
     tv.tv_usec = 500000;
    
     FD_ZERO(&readfds);
     FD_SET(STDIN, &readfds);
    
     // don't care about writefds and exceptfds:
     select(STDIN+1, &readfds, NULL, NULL, &tv);
    
     if (FD_ISSET(STDIN, &readfds))
      printf("A key was pressed!\n");
     else
      printf("Timed out.\n");
    
     return 0;
    }
    



    编辑:请参见答案,因此我们只需按回车键:

    :~$ ./select 
    
    A key was pressed!
    

    或者我们可以用 stty raw (然后用 stty cooked ):

    :~ stty raw
    :~ ./select 
                                                dA key was pressed!
                                                                   :~ stty cooked 
    

    1 回复  |  直到 15 年前
        1
  •  0
  •   anon    15 年前

    标准输入是缓冲流。在输入的末尾点击换行符之前,select()调用将无法检测是否有可用的输入。不能像这样使用select()来读取单个击键。