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使用的是没有缓冲的操作,而标准库函数的存在就是维护了一个缓冲区,作用是提高了效率,类似于一个菜鸟驿站,货物累积到一定程度再发车,节省成本

一般而言,使用缓冲都可以提高利用率与效率,但是对于一些实时操作系统或者网络,最好使用无缓冲

缓冲

  1. 无缓冲
  2. 全缓冲:把整个buff填满以后进行数据转移
  3. 行缓冲:遇到换行就系统调用,包含了全缓冲与\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>
#

image-20230413152807086

image-20230413155044818

image-20230413152916397

man手册

1.基础命令

2.操作系统内核提供的系统调用

3.库调用

posted @   tldrIKC  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示