我一直想知道scanf()/ printf()实际上是如何在硬件和操作系统级别上运行的。数据流在哪里以及操作系统在这些时间的确切行动是什么?操作系统会调用什么?等等...
答案 0 :(得分:23)
scanf()和printf()是libc(C标准库)中的函数,它们分别调用read()和write()操作系统系统调用,分别与文件描述符stdin和stdout对话(fscanf和fprintf)允许您指定要读取/写入的文件流。
调用read()和write()(以及所有系统调用)会导致用户级应用程序中的“上下文切换”进入内核模式,这意味着它可以执行特权操作,例如直接与硬件通信。根据您启动应用程序的方式,'stdin'和'stdout'文件描述符可能绑定到控制台设备(例如tty0)或某种虚拟控制台设备(如xterm暴露的设备)。 read()和write()安全地将数据复制到称为'uio'的内核缓冲区中。
scanf和printf的格式字符串转换部分不会在内核模式下发生,但只是在普通用户模式下(在'libc'内),使用syscalls的一般经验法则是尽可能不频繁地切换到内核模式,既可以避免上下文切换的性能开销,也可以保证安全性(在内核模式下发生任何事情都需要非常小心!内核模式中的代码越少意味着操作系统中的错误/安全漏洞越少)。
btw ..所有这些都是从unix的角度编写的,我不知道MS Windows是如何工作的。
答案 1 :(得分:1)
在我的操作系统上,我正在使用scanf和printf基于函数getch()ant putch()。
答案 2 :(得分:0)
我认为操作系统只提供两个流,一个用于输入,另一个用于输出,流抽象出输出数据的呈现方式或输入数据的来源。
所以scanf& printf正在做的只是从任一流中添加字节(或消耗字节)。
答案 3 :(得分:0)
scanf , printf etc internally all these types of functions can't be directly written in c/c++ language. internally they all are written in assembly language by the use of keword "asm", any thing written with keyword "asm" are directly introduced to object file irrespective of compilation (not changed even after compilation), and in assembly language we have got predefined codes which can implement all these functions ...... so in short SCANF PRINTF etc ALL ARE WRITTEN IN ASSEMBLY LANGUAGE INTERNALLY. YOU CAN DESIGN YOUR OWN INPUT FUNCTION USING KEYWORD "ASM".