在C程序中,有printf和scanf函数,它们实际上是连接程序和输出屏幕设备和输入键盘设备的函数。将printf和scanf函数视为设备驱动函数是否正确?
答案1
不,因为他们不与设备完全交互。printf/scanf 和实际设备驱动程序之间可能有 5-6 个抽象层。
真的重点printf/scanf 函数的一个缺点是它们使用“标准 I/O”——它们只与操作系统提供的抽象“文件描述符”交互。它们实际上甚至不知道给定的文件描述符是从键盘、文件还是 TCP 套接字读取的,因为那是操作系统内核的工作。
(事实上,即使在“键盘”的情况下,输入文件描述符通常与实际的键盘设备无关,而是对应于另一个抽象层“tty”或“终端设备”。甚至那个 tty 也是虚拟化的 - 它可以是一个串行端口,或者一个 xterm 窗口,或者一个 SSH 连接,或者一个 telnet 套接字。)
例如,如果您的程序在 GNOME 终端内运行,您将拥有:
物理键盘设备 → 内核 PS/2 设备驱动程序 → /dev/input 设备抽象(evdev)→“libinput”事件处理库 → X11 图形环境(XInput2 事件)→ GTK 应用程序工具包 → VTE 终端仿真器 → 内核“伪 tty”(pty)设备 → 'stdin' 文件描述符 → C 标准库 FILE* 抽象 → sscanf() 函数。