scanf()如何在操作系统内部工作?

我一直在想如何scanf()/ printf()实际上在硬件和操作系统级别上工作。 数据在哪里流动以及操作系统在这些时间到底做了什么? 操作系统会调用什么? 等等…

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

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

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

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

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

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

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

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