c/c++语言开发共享Linux C选择:管道回显到输入工作,但从键盘读取不?

我想了解https://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 https://beej.us/guide/bgnet/examples/select.c :~$ gcc select.c -o select :~$ echo "ff" | ./select A key was pressed! :~$ ./select TYPINGTYTimed out.

 :~$ cat /etc/issue Ubuntu 10.04 LTS n l :~$ gcc --version gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 :~$ wget https://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  #include  #include  #include  #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 

    标准输入是缓冲流。 select()调用将无法检测到在输入结束时命中换行符之前有可用输入。 您不能使用这样的select()来读取单个击键。

      以上就是c/c++开发分享Linux C选择:管道回显到输入工作,但从键盘读取不?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/519066.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐