1.文件
文件
Linux系统编程学习路线
概念:利用system call 进行编程
特点:1.无法跨平台
2.速度慢,内核切换,更加耗费时间
3.更加底层,接口复杂
标准库函数与系统调用
fopen(3)
调用open(2)分配一个FILE结构体(句柄),包含文件描述符、IO缓冲区、当前读写位置等,返回FILE结构体的地址;
fgetc(3)
通过传入的FILE*参数找到文件的描述符、IO缓冲区、当前读写位置,判断能够从IO缓冲区中读到下一个字符,如果能,就直接读,否则就调用read(2),把文件描述符传入进去,让内核读取该文件的数据到IO缓冲区,然后返回下一个字符。read是读一批字符进buff,而且有可能会溢出
fputc
判断IO缓冲区是否还有空间再次存放一个字符,如果有空间直接保存在IO缓冲区并返回,如果没有,就调用write(2),让内核吧IO缓冲区写回文件。
fclose
如果IO缓冲区中还有数据没有写回文件,调用write(2)写回文件,然后调用close(2)关闭文件,释放FILE结构体和IO缓冲区,文件重新返回磁盘。
意义
标准库函数存在的意义,就是维护了一个缓冲区的概念,open、read、write、close使用的是没有缓冲的操作,而标准库函数的存在就是维护了一个缓冲区,作用是提高了效率,类似于一个菜鸟驿站,货物累积到一定程度再发车,节省成本
一般而言,使用缓冲都可以提高利用率与效率,但是对于一些实时操作系统或者网络,最好使用无缓冲
缓冲
- 无缓冲
- 全缓冲:把整个buff填满以后进行数据转移
- 行缓冲:遇到换行就系统调用,包含了全缓冲与\n情况
验证
#include<stdio.h>
int main(void){
fputc('A',stdout);
fputc('\n',stdout);
//stdout是行缓冲,没有\n就不会显示A
fput('A',stderr);
//stderr,无缓冲,直接输出
//stdout与stderr都是文件、屏幕也是文件、一切皆文件
for(int i = 0 ; i < 1024;i++){
//自己二分法测试电脑缓冲区大小
fput('A',stdout);
}
//前1024不会显示,第1025会显示
while(1){;}//或sys("pause");
return 0;
}
文件系统调用
open
打开或者创建一个文件
#incldue<sys/types.h>
#
man手册
1.基础命令
2.操作系统内核提供的系统调用
3.库调用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现