当前位置: 首页 > 面试题库 >

从stderr获得键盘输入的更少?

娄学文
2023-03-14
问题内容

我正在研究“ less”实用程序的代码,特别是它如何获取键盘输入的代码。有趣的是,在ttyin.c的第80行,它将文件描述符设置为从以下文件读取:

     /*
      * Try /dev/tty.
      * If that doesn't work, use file descriptor 2,
      * which in Unix is usually attached to the screen,
      * but also usually lets you read from the keyboard.
      */
  #if OS2
      /* The __open() system call translates "/dev/tty" to "con". */
      tty = __open("/dev/tty", OPEN_READ);
  #else
      tty = open("/dev/tty", OPEN_READ);
  #endif
      if (tty < 0)
          tty = 2;

文件描述符2不是stderr吗?如果是这样,是什么?我以为键盘输入是通过stdin发送的。

有趣的是,即使这样做ls -l * | less,在文件加载完成后,您仍然可以使用键盘上下滚动,但是如果这样做ls -l * | vi,则vi会大吼大叫,因为它不会从stdin中读取。有什么大主意?我如何最终进入这个陌生的新大陆,在那里stderr既是向屏幕报告错误又是从键盘读取信息的一种方式?我不认为我已经在堪萨斯州了…


问题答案:
$ ls -l / dev / fd /
lrwx ------ 1 me me 64 2009-09-17 16:52 0-> / dev / pts / 4
lrwx ------ 1 me me 64 2009-09-17 16:52 1-> / dev / pts / 4
lrwx ------ 1 me me 64 2009-09-17 16:52 2-> / dev / pts / 4

在交互式终端上登录时,所有三个标准文件描述符都指向同一件事:您的TTY(或伪TTY)。

$ ls -fl / dev / std {in,out,err}
lrwxrwxrwx 1根根4 2009-09-13 01:57 / dev / stdin-> fd / 0
lrwxrwxrwx 1根根4 2009-09-13 01:57 / dev / stdout-> fd / 1
lrwxrwxrwx 1根根4 2009-09-13 01:57 / dev / stderr-> fd / 2

按照惯例,我们读出0和写入12。但是,没有什么可以阻止我们采取其他行动。

当你的shell运行时ls -l * | less,它创建了一个从管道ls的文件描述符1less的文件描述符0。显然,less它不再能够从文件描述符中读取用户的键盘输入0-它会设法将TTY重新找回。

如果less尚未从终端上拆下,open("/dev/tty")将给它TTY。

但是,如果失败了,该怎么办? less尝试最后一次获取TTY,假设文件描述符2附加到了文件描述符附加的同一对象0上(如果未重定向的话)。

不是 故障预防:

$ ls -l * | 少setsid 2> / dev / null

在这里,less为其分配了自己的会话(因此它不再是终端活动进程组的一部分,从而导致open("/dev/tty")失败),并且其文件描述符2已更改-
现在less立即退出,因为它正在输出到TTY,但无法获取任何用户输入。



 类似资料:
  • 问题内容: 我已经用Java设计了自己的合成器,现在我想将其与Midi键盘连接。我在下面的课程搜索所有带有发射器的Midi设备。它成功找到了我的Midi键盘。我将自己的接收器添加到每个设备的每个发送器中,以便它可以接收所有可能的信息。通过阅读所有帮助文档和Java文档,我知道Transmitter将MidiEvents发送给Receiver,然后由Receiver使用send方法处理它们。因此,我

  • 我正在用PyGame1.9做一个游戏。这是一个失败的简单游戏,一艘船在五列坏人之间移动,这些坏人通过缓慢向下移动进行攻击。我正试图让它,使船舶左,右移动与左右箭头键。这是我的密码: 它工作得太好了。船开得太快了。几乎不可能让它只移动一个位置,向左或向右。我怎样才能使船在每次按键时只移动一次?

  • 我希望javafx标签自动更新为正在输入到文本字段中的内容,目前我只有在单击回车键时才更改它。我正在使用秋千和javafx的混合。 这可能吗? 谢谢

  • 问题内容: 我正在用Java编写游戏,现在是Swing + JOGL-一个带有GLCanvas的JFrame。 我使用etc.事件()处理输入,但似乎无法正常工作: 当我同时按下3个以上的键时,它们无法正确注册 -显然这是键盘的错误,我必须找到替代的控制方案。 窗口丢失后,重新获得焦点,输入完全停止工作… 我究竟做错了什么? 有没有更好的方法来处理Java中的键盘输入? (除非我别无选择,否则我不

  • 问题内容: 不同的iOS设备上的键盘高度不同。有人知道我如何以编程方式获取设备键盘的高度吗? 问题答案: 在Swift中: 您可以通过订阅通知来获取键盘高度。(假设您想知道显示的高度是多少)。 像这样: 迅捷2 迅捷3 斯威夫特4 然后,您可以使用以下功能访问高度: 迅捷2 迅捷3 斯威夫特4