程序运行的时候,会自动打开三个文件,分别是stdin、stdout、stderr

这三个文件对应的外设分别是 键盘、显示器、显示器

这三个文件对应的文件描述符为 0、1、2

printf函数在显示器上打印数据是如何实现的??

一、通过write函数理解打印的过程

我们要打印数据,本质上就是向 fd = 1指向的文件输送数据(因为默认情况下 fd = 1指向的文件是显示器文件)

所以我们 通过write函数向fd = 1 写入数据 -----> 向显示器文件写入数据

二、关闭 fd = 1,测试 printf 函数是否打印

fd = 1 字符打印到显示器上

测试代码

测试结果

显示器上没有打印字符,但是字符被写入到 log.txt 文件当中了。

open函数:建立 struct files 和 文件结构体  之间的联系

close函数:断开 struct files 和 文件结构体  之间的联系

三、原因分析

printf函数的功能:在显示器上打印指定的内容,向显示器文件stdout中写入内容

首先,我们看看这里所谓的stdout到底是什么?!

stdout 的类型是File*,也就是对应文件结构体File的地址

每个文件结构体FILE中必定包含 封装好的文件描述符(如下)

typedef struct _IO_FILE FILE;   //在usr/include/stdio.hstruct _IO_FILE
{//其他的先不考虑...//...int _fileno; //封装的文件描述符
}

原因解释

stdout对应的结构体 中封装好的文件描述符 fd = 1

printf函数要打印内容那就去找stdout,stdout对应的结构体中封装好的文件描述符 fd = 1,通过fd = 1定位到对应的文件结构体地址,然后向这个文件输送内容。

下标为1对应的文件替换成了其他文件log.txt

这就是printf打印的过程,只认stdout里包含的fd,即只认识下标,不管这个下标指向哪。

原文链接:printf函数打印(一)—— 过程解析篇_仲夏夜之梦~的博客-CSDN博客_printf 打印结构体

printf函数打印相关推荐

  1. Python直接调用C库的printf()函数打印一条消息

    github博客传送门 csdn博客传送门 话不多说直接上代码 # 直接从 C 库中调用 printf()函数打印一条消息 # Windows 中的 C 库位于 C:\WINDOWS\system32 ...

  2. printf函数打印(一)—— 过程解析篇

    程序运行的时候,会自动打开三个文件,分别是stdin.stdout.stderr 这三个文件对应的外设分别是 键盘.显示器.显示器 这三个文件对应的文件描述符为 0.1.2 printf函数在显示器上 ...

  3. codeblocks printf函数打印不出来_最全C语言基本程序交互函数之输出到屏幕

    前言 上一栏目主要讲解了各种数据类型的知识,大家先闭眼回顾一下数据类型的知识哦.本章节主要内容是讲解程序的基本交互设计之程序的输出.程序和人交互无非就是通过外设进行输入信息,C语言中基本的交互的基本流 ...

  4. 【STM32学习5】STM32使用printf函数 打印到电脑串口助手

    本文所使用的方法与代码参考自正点原子,如果想要详细了解这方面的知识,请阅读正点原子官方提供的文档. 一.背景 在开发STM32应用时,将一些信息通过串口打印到电脑上是常用的调试手段.C语言标准库中的p ...

  5. stc单片机使用printf()函数打印

    串口波特率初始化: 利用stc-isp工具生成初始化代码, 在串口初始化函数中添加 **TI=1;**如下图,否则printf()无法输出. void UartInit(void) //9600bps ...

  6. 通过uart串口和printf函数打印

    #include "stdio.h" int __io_putchar(int ch) { HAL_UART_Transmit(&huart1,(uint8_t *)&am ...

  7. C语言程序设计基础及应用实例---第一节 printf函数的使用

    (1)printf函数打印字符串 #include <stdio.h>int main(void) {printf("Helloworld!\r\n");return ...

  8. 这两种printf()函数重定向方法,太实用了

    作者:echobright 原文链接:https://blog.csdn.net/qq_29344757/article/details/75363639 在前面学习了STM32的串口编程,通过USA ...

  9. STM32的printf函数重定向

    版权声明:原创文章,请持怀疑态度阅读,欢迎转载,但请注明文章出处. https://blog.csdn.net/qq_29344757/article/details/75363639 在前面学习了S ...

最新文章

  1. 我看你还能坚持多久?!
  2. linux远程调用的脚本在ssh时报错,linux:ssh远程调用tomcat脚本时候出错
  3. PKU 学生的反馈 2009-1
  4. h5优秀控件_H5前端学习的js插件大全,基本包含了大部分的前端最前沿的js插件和库。...
  5. VSCode 实时预览HTML网页效果 - Live Server插件
  6. 软件的极简主义的三个大敌:配置文件,冗余的参数,和大量复杂的接口。
  7. vue ---- webpack -插件 html-webpack-plugin
  8. 【4】测试用例设计-判定表法
  9. TortoiseGit和msysGit安装及使用笔记(windows下使用上传数据到GitHub)[转]
  10. 货币代码php,PHP货币换算程序代码_PHP教程
  11. 添加源显示未找到使用主机服务器,未能找到主机指定使用服务器
  12. 尚来古籍——江氏族谱
  13. 在Ubuntu中安装并配置Pycharm教程
  14. 【python】把Excel中的数据在页面中可视化
  15. 基于语法分析的公式分析器设计
  16. css和html的用法,HTML与CSS之CSS的基本使用
  17. nessus安装及使用
  18. 面试技巧自我介绍大全
  19. 技术干货:Apache Pulsar 在移动云上的应用
  20. ctfshow 做题 萌新 模块(3)

热门文章

  1. 镰刀电脑闹钟 V1.0
  2. 一款基于安卓的法语电影字幕听写软件的原型
  3. 金蝶EAS本地WebService发布
  4. div结合css布局bbs首页
  5. IDEA使用lombok
  6. 好用的外贸邮箱有哪些?公司企业邮箱申请哪个好?
  7. [js]windows下通过命令行运行javascript脚本,支持命令行参数
  8. SpringBoot(读取配值文件里面的属性)
  9. DDR3、DDR3L以及LPDDR3对比介绍,规范解读以及硬件设计开发实际案例分享
  10. numpy 高级索引技巧