c - printf 在内部是如何工作的?

标签 c assembly printf standard-library

<分区>

我很好奇 printf 在 Linux 内部是如何工作的。我不明白它如何将数据写入 STDOUT

经过一些内部搜索,我下载了 glibc 并查看了源代码:

__printf (const char *format, ...)
{
   va_list arg;
   int done;

   va_start (arg, format);
   done = vfprintf (stdout, format, arg);
   va_end (arg);

   return done;
}

找到这个之后,我深入研究了 vfprintf 函数——但该文件大约有 2500 行陌生的 C 代码。我正在从 10,000 英尺的高度寻找 printf 如何与计算机的内存和输出一起工作以在屏幕上显示字符的解释。

如果我是一段汇编代码,我需要做什么才能完成同样的任务?它是否依赖于操作系统?

最佳答案

我认为您看错层了。 vfprintf 中的逻辑负责格式化其参数并通过底层 stdio 函数将它们写入,通常写入它所针对的 FILE 对象中的缓冲区。将此输出输出到文件描述符(或在其他非 POSIX 类系统上,底层设备/文件表示)的实际逻辑可能在 fwritefputc 中,和/或一些以 __ 为前缀的内部函数(可能是 __overflow)。

关于c - printf 在内部是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18279908/

相关文章:

c - 内存泄漏......解释(希望)

assembly - 从硬盘读取字符串并通过汇编打印到 TTY 选项

assembly - 进位标志加法指令与 adc $0 不同吗?

c - 为什么程序不执行最终的 printf 语句?

c - 从 fgets() 输入中删除换行符

c - printf ("%i") 和 printf ("%d") 有什么区别

c - "Local"C 中的标签和跳转表实现

SDL 程序中的颜色已关闭

c++ - 在 C 或 C++ 中的空行后开始打印

assembly - x86_64 检查 2 次加载/存储的幂是否会针对 2 个指针进行页面交叉