9

我一直想知道 scanf()/printf() 在硬件和操作系统级别实际上是如何工作的。数据流向哪里,操作系统在这些时间到底在做什么?操作系统会发出什么调用?等等...

4

4 回答 4

26

scanf() 和 printf() 是 libc(C 标准库)中的函数,它们分别调用 read() 和 write() 操作系统系统调用,分别与文件描述符 stdin 和 stdout 对话(fscanf 和 fprintf 允许您指定要从中读取/写入的文件流)。

对 read() 和 write()(以及所有系统调用)的调用会导致从用户级应用程序“上下文切换”到内核模式,这意味着它可以执行特权操作,例如直接与硬件对话。根据您启动应用程序的方式,“stdin”和“stdout”文件描述符可能绑定到控制台设备(如 tty0)或某种虚拟控制台设备(如 xterm 公开的设备)。read() 和 write() 安全地将数据复制到/从称为“uio”的内核缓冲区。

scanf 和 printf 的格式字符串转换部分不会在内核模式下发生,而只是在普通用户模式下(在“libc”内部),系统调用的一般经验法则是尽可能不频繁地切换到内核模式,两者都是为了避免上下文切换的性能开销和安全性(您需要非常小心内核模式下发生的任何事情!内核模式下的代码越少意味着操作系统中的错误/安全漏洞越少)。

顺便说一句..所有这些都是从 unix 的角度编写的,我不知道 MS Windows 是如何工作的。

于 2009-08-10T04:48:29.977 回答
1

在我的操作系统上,我使用 scanf 和 printf 基于函数 getch() ant putch()。

于 2009-08-10T05:57:41.070 回答
0

我认为操作系统只提供了两个流,一个用于输入,另一个用于输出,这些流抽象了输出数据的呈现方式或输入数据的来源。

所以 scanf 和 printf 所做的只是从任一流中添加字节(或消耗字节)。

于 2009-08-10T04:47:42.550 回答
0

scanf , printf 等内部所有这些类型的函数都不能直接用 c/c++ 语言编写。在内部它们都是通过使用关键字“asm 用汇编语言编写的,任何用关键字“asm”编写的东西都直接引入目标文件,而与编译无关(即使在编译后也不会改变),并且在汇编语言中我们已经预定义可以实现所有这些功能的代码......所以简而言之,SCANF PRINTF 等都在内部用汇编语言编写。您可以使用关键字“ASM”设计自己的输入功能。

于 2018-03-25T20:29:40.247 回答