【Linux】 基础IO流

目录

在正式介绍IO流之前 先简单的了解一下IO流在c语言中的应用
printf()函数,我们在c语言中不能再熟悉的函数,可是为什么调用这个函数就会向显示器上打印内容呢?
先介绍一下c语言操作相关的函数 fopen(),fwrite(),fread()
首先打开一个文件(没有的话则创建一个)
在这里插入图片描述
fread函数原型

size_t  fread(void * buffer ,size_t  size, size_t  count, FILE  *stream) 

在这里插入图片描述
执行完成之后test文件中的内容
在这里插入图片描述
fwrite函数原型

size_t fwrite(void * buffer, size_t size, size_t count, FILE * stream);

将文件中的内容写入到buffer缓冲区中,和上面类似,这里就不举例说明了

*---------------------------------------------------------------------------------------------------------------------------------------

说了这么多 这和printf有什么关系呢?下面开始介绍printf如何向显示器上输出

在linux下一切皆文件,所以我们的显示器,键盘,硬盘都可以看做是文件。
c程序会默认的打开三个文件流 即stdout(标准输出流),stdin(标准输入流)以及stderr(标准错误流) printf函数做的工作就是向 标准输出流stdout 中写入数据。

有了以上的知识储备 我们是不是可以不用printf函数也能向屏幕中打印内容呢?
在这里插入图片描述
运行结果
在这里插入图片描述

系统IO接口

在这里插入图片描述
通过这张图可以知道 我们作为用户层无法直接向底层写入 必须要通过系统调用接口来实现
所以 c语言中的文件操作函数一定封装了系统的调用接口
那么下面来介绍一下 这些接口

#include <unistd.h>

size_t write(int flides, const void *buf, size_t nbytes);

size_t read(int flides, void *buf, size_t nbytes);

int open(const *path, int oflags);

举例,将一串字符写入到标准输出里

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int real_num = write(1,"here is my word\t",17);
    exit(0);
}

运行结果
在这里插入图片描述
看到这里 就会发现很多问题
比如 为什么open的返回值只是一个int,write函数为什么传入一个整数就可以代表标准输出
想要解释这些问题就要引入一个概念

“文件描述符”

每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体,其实task_struct就是Linux内核的一种数据结构
在这里插入图片描述

文件描述符的本质就是file* fd_array中的下标。
所以open函数返回整数 其实本质上是返回一个文件标识符 也就是控制文件属性数组的下标
**
C语言中的FILE结构体中也封装了文件标识符,可以通过函数int fileno(FILE *stream);来查看
在这里插入图片描述
运行结果在这里插入图片描述

文件标识符分配规则

在这里插入图片描述
在这里插入图片描述
执行之后 hello linux被写入到test.txt文件中了
是不是感觉很神奇
其中的原因是 关闭了标准输出流 则file* fd_array[1]中的内容被清空了,文件标识符的分配规则是从小到大依次分配。所以现在file* fd_array[1]中的file文件test.txt,printf函数只负责向file* fd_array[1]中写入数据,所以就有了以上情况。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值