Linux系统调用与C库I/O的底层奥秘

文件操作

  • open close write read 属于Linux系统调用/属于"文件 I/O",也叫"低级 I/O",所属层级 在操作系统,无缓冲 , 每次调用都陷入内核,频繁调用开销大。

  • fopen fwrite fread fclose ... 属于标准C库/ 标准 I/O,定义在 C 标准头文件 <stdio.h> 中,所属层级在用户空间,有缓冲,内部会调用底层的 open/read/write/close 等系统调用。

C库缓存的特点:

1.遇到\n 时,会将库缓存的内容写到内核缓存中,即调用了系统调用函数。

2.库缓存写满时,会调用系统调用函数,将库缓存内容写到内核缓存中。1024。

printf 也是标准 I/O,本质上是对 标准输出流 stdout 的格式化写入。最终输出到/dev/tty(终端设备)

++std++ ++::endl 和 "\n" 都可以用于换行,但它们之间有几个关键区别:++

"\n"不会强制刷新输出缓冲区。std::endl会立即刷新输出流的缓冲区(std::cout 的缓冲区)。

使用 "\n" 更高效,因为缓冲区会在适当的时候自动刷新(比如程序结束、缓冲区满、或遇到输入操作等);std::endl 会强制刷新缓冲区,频繁使用会导致性能下降,尤其是在大量输出时。

  • 行缓存 ,遇到换新行(\n),或者写满缓存时,即调用系统调用函数,如::fgets,gets,printf,fprintf,sprintf,fputs,puts,scanf

  • 无缓存 只要用户调这个函数,就会将其内容写到内核中。如:stderr

  • 全缓存 只有写满缓存再调用系统调用函数,如:fread、fwrite

相关推荐
怎么比啊都是大神几秒前
关于==null、isEmpty()和StrUtil.isBlank()
java
唐青枫3 分钟前
Java Neo4j 实战指南:从图模型、Cypher 到 Spring Boot 关系查询
java
观远数据9 分钟前
从离线开发到实时同步:DataFlow如何支撑企业级数据治理闭环
java·windows·microsoft·excel
今天AI了吗1 小时前
Hermes Agent 搭建全流程:从本机试跑到可持续运行的个人 AI Agent
java·人工智能·python·学习·embedding
春卷同学1 小时前
032-关系型数据库在记账应用中的建模与查询优化
java·jvm·数据库
不平衡的叉叉树2 小时前
Springboot+Mockito简单使用单元测试
java·spring boot·单元测试
空中湖2 小时前
Spring AI 多模型接入实战:OpenAI、Ollama、通义千问切换只需改配置
java·人工智能·spring
tianyatest2 小时前
表格分类统计及排序
java·excel·暖通
山东点狮信息科技有限公司2 小时前
企业级开源OA系统推荐
vue.js·spring boot·性能优化·系统架构·开源
万亿少女的梦1682 小时前
基于Spring Boot与MySQL的乡镇群众服务系统设计与实现
java·spring boot·mysql·权限管理·前后端分离