【问题标题】:How Does Scanf Find Keyboard Input?Scanf 如何查找键盘输入?
【发布时间】:2014-09-03 06:34:03
【问题描述】:

我正在浏览scanf here 的实现,但找不到程序从键盘获取输入的确切方法。我知道总有更深的一层要走,但有人可以解释一下 C 代码下面的一步,即 scanf,如何使我的程序可以使用键盘输入?

【问题讨论】:

  • 文件名可能是scanf.c,但是看代码里面没有scanf()这个函数。那是sscanf()的代码。
  • 啊!!该死。然后我想我更好的问题是我可以在哪里找到一个实现,甚至更好,如果有人可以解释它......
  • 与搜索引擎的一些工作出现了this implementation,它交给了__svfscanf,实现了here

标签: io keyboard scanf


【解决方案1】:

尽管文件名为scanf.c,但它只包含sscanfvsscanf 函数(加上另一个对C 库API 不重要的内部函数)。

因此它只用于扫描字符串而不是从文件中读取。

实际 scanf 的工作方式而言,它通常只使用 C 库中较低级别的函数,例如 getchar()ungetc()

那些函数的工作方式而言,这取决于实现。它可能会再次调用较低级别的函数,它可能有一个内存映射键盘,因此它可以读取内存以获得击键,它可能会接收中断并将键存储在 ISR 中以供以后提取。

可能性非常广泛。


对于一些具体示例,我为教育市场开发了一个微处理器模拟器,它使用键盘(和其他设备)的 I/O 端口。所以最底层的代码如下:

:keyin  equ  07d2         ; memory mapped keyboard port
        push rf           ; preserve register
        setw rf :keyin    ; use register f for input
:loop   inb  r0 rf        ; get keyboard value to register 0
        jz   :loop        ; 0 means none available, so try again
        pop  rf           ; restore register f, register 0 now holds key

相比之下,(更成功的)Linux 可以使用其中一个系统调用来从输入文件描述符中读取字符:

buffer: db   ?
getch:  mov  eax, 3        ; sys_read
        mov  ebx, 0        ; descriptor 0 (input)
        mov  ecx, buffer   ; address to store data
        mov  edx, 1        ; get one character
        int  80h           ; make system call (old style).

【讨论】:

  • @Anthony,请确保您没有修改您的问题,以便它完全不同。如果您有不同的问题,请将其作为不同的问题提出
  • 嗯。我认为我的标题是我所要求的,但是内容被错误的链接抛弃了。我应该提出一个新问题吗?
  • 我觉得这有点像警察,自然我现在想知道 getchar() 是如何工作的!操作系统是否只有某种定义的方式来读取来自我的键盘的信号,而 C 只是捎带?
猜你喜欢
  • 2017-10-30
  • 2015-04-12
  • 2018-02-15
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2021-12-25
  • 2013-05-20
相关资源
最近更新 更多