Linux学习日记6:文件IO与标准IO

一、前言

前面我们学习了CP指令的相关知识以及CP指令的实现,今天我们来学习文件IO与标准IO的区别, 这是Linux 文件操作的核心,理解两者差异是高效编程的关键。

二、文件IO

Linux 中文件 IO(系统级 IO)是内核提供的底层接口,直接与内核交互,无中间封装层;文件IO是直接调用内核提供的系统调用函数, 头文件是unistd.h。如下图所示:

上图中的应用代码即程序缓存,就是想从内核读写的缓存(数组),也叫用户缓存,每打开一个文件,内核在内核空间中也会开辟一块缓存,这个叫内核空间的缓存;文件IO中的写即是将用户空间中的缓存写到内核空间的缓存中;文件IO中的读即是将内核空间的缓存写到用户空间中的缓存中,默认无缓存 ,数据读写需用户手动管理缓存区。像我们之前所学的open、close、writeread函数都是文件IO,都以文件描述符为操作对象,是一个非负整数。如下图所示:

我们用一个简单的小例子来进行讲述:

cs 复制代码
#include<unistd.h>

int main(int argc,char *argv[])
{
        char readbuf[20]="hello world";
        write(1,readbuf,12);
        return 0;
}

如上代码所示,我们将一串字符串通过write函数写出来(文件描述符为1,代表输出),然后通过gcc编译器进行编译,然后运行:

可以看到write函数成功地将字符串打印了出来。

三、标准IO

标准 IO 是 C 标准库(如 glibc)提供的接口,是间接调用系统调用函数 ,头文件是: stdio.h;底层基于文件 IO 实现,核心作用是封装缓存 和**简化编程,**如下图所示:

标准IO的库函数中也有一个缓存,这个缓存称为----库缓存,库缓存的特点有:1.遇到**\n** 时,会将库缓存的内容写到内核缓存中,即调用了系统调用函数;2、库缓存写满时,会调用系统调用函数,将库缓存内容写到内核缓存中(写满的条件是1024个字节)。

我们用一个简答的小例子来进行描述:

cs 复制代码
/#include<unistd.h>
#include<stdio.h>

int main(int argc,char *argv[])
{
        char readbuf[20]="hello world";
        //write(1,readbuf,12);
        printf("%s\n",readbuf);
        while(1);
        return 0;
}

如上代码所示,我们将文件IO替换成标准IO,并加上一个死循环,然后使用gcc编译器进行编译,然后运行:

可以看到"hello world"被成功地打印了出来。那如果我们将\n给删掉会怎么样?

cs 复制代码
//#include<unistd.h>
#include<stdio.h>

int main(int argc,char *argv[])
{
        char readbuf[20]="hello world";
        //write(1,readbuf,12);
        printf("%s",readbuf);
        while(1);
        return 0;
}

再次编译并运行:

这时候可以发现字符串打印不出来了,这就验证了C库缓存的存在。

相关推荐
曼巴UE54 分钟前
UE5 客户端 需要的网络同步概念总结(3 )-事件同步 RPC 以及三种调用方式
网络·c++·网络协议·学习·rpc·ue5
昌原的儿子LEO5 分钟前
IMX6ULL 时钟系统与 EPIT/GPT 定时器原理与配置
arm开发·学习
xiaoye-duck11 分钟前
《Linux 网络编程》深入理解数据链路层:从MAC帧到ARP协议的底层原理详解
linux·网络
乌暮15 分钟前
Java 抽象类与接口详解:半成品图纸 vs 能力合同
java·开发语言·后端·学习
AAA代码批发商22 分钟前
Days 47 IMX6ULL 裸机开发:按键轮询实验 + 外部中断原理剖析(上)
笔记·学习·imx6ull·裸机开发·#arm中断
一条破秋裤25 分钟前
Hi3516CV610 20S V4 开发板启动与调试流程
学习
牵猫散步的鱼儿30 分钟前
stride 图像步长
c语言
刃神太酷啦43 分钟前
前端入门第一课:HTML 基础语法 + 常用标签 + 实战全解
服务器·c语言·前端·javascript·css·c++·html
j7~1 小时前
【Linux 网络】四十.《网络基础(传输层协议:UDP、TCP)》--中篇
linux·tcp·tcp协议·确认应答机制·连接管理机制·tcp流量控制
山下梅子酒2251 小时前
洛谷-入门-B2055
c语言