【发布时间】:2014-10-05 06:46:00
【问题描述】:
在C语言中,在屏幕上打印东西时,我们通常使用printf、puts等。这些都在或其他抬头文件中定义。
有没有什么方法可以在不使用这些功能的情况下在屏幕上打印一些东西?也就是说printf是怎么实现的?
【问题讨论】:
-
我更新了我的答案。抱歉答案有误。
标签: c
在C语言中,在屏幕上打印东西时,我们通常使用printf、puts等。这些都在或其他抬头文件中定义。
有没有什么方法可以在不使用这些功能的情况下在屏幕上打印一些东西?也就是说printf是怎么实现的?
【问题讨论】:
标签: c
最终,C 函数printf 将直接或通过write 产生sys_write 系统调用(请参阅man 2 write)。实际实现取决于编译器和标准库。
【讨论】:
打印到屏幕需要访问帧缓冲区(硬件),并且不允许用户空间程序直接访问它。所以他们所做的是进行系统调用,内核为他们执行所需的功能。 printf -> write 系统调用 -> 内核将数据写入帧缓冲区,然后将控制权交还给用户程序。
即使您不想使用printf 或puts(它们在托管的libc 中实现),您仍然必须使用write 系统调用来告诉内核您要在哪个设备上写入缓冲区。
【讨论】:
标准头文件不一定是包含用 C 代码编写的函数的库。
它们是带有 C“interfase”的函数,但是它们很可能包含明确的机器代码,在每种情况下都适用于目标系统。
标准头文件以这种方式提供了执行在严格的 C 代码中无法实现的特殊处理的方法。
在printf()的具体情况下,情况就更清楚了,因为如果没有任何头是#include-d,那么就没有任何机制通过只使用C语法来执行输入/输出操作。
【讨论】:
library ncurses 可以帮助你,但如果你想使用低级函数使用write(),如果你想做内核编程你必须使用printk()
【讨论】:
bash 无关,除了bash 在C 中实现。我回滚了您所做的编辑(添加了 bash 标记)。如果您的答案不适用,我们可以轻松地将其否决,但查找和纠正您的不当编辑需要付出更多努力,因此请在编辑时更加谨慎和保守。