科技 > 操作系统 > Unix

IO进程——系统IO与文件IO

162人参与 2024-07-31 Unix

io进程——系统io与文件io

	在应用开发过程中会经常需要访问文件。linux下读写文件的方式有两大类:标准io和文件io。
	本次就来讲一讲文件io和标准io,以及两者的区别。

一、文件io

在linux系统中,大部分机制都会抽象成一个文件,这样,对它们的操作就像堆文件的操作一样。在嵌入式i/o变成是常用也是最基本的内容。

要了解文件i/o操作首先得知道文件的定义:

           - 文件的定义:一组相关数据的有序集合
           - 文件名:这个数据集合的名称
           linux下有7种类型的文件:
                 - 普通文件
                 d 目录文件
                 l 链接文件(ln -s :软链接)
                 p 管道文件
                 s 套接字文件
                 b 块设备文件
                 c 字符文件

以上文件类型在linux通过命令查看
在这里插入图片描述
上图中蓝色框选中部分则是文件的类型;

linux和windows有所区别,windows系统是以文件后缀名来判断文件类型,但linux则是通过文件内容判断文件类型

(一) 文件 io的定义

系统提供的一组操作文件的函数接口,文件的所有操作都有对应的函数来完成。

	那文件都有哪些操作(操作文件数据)呢?
	无非就是打开、关闭、读 、写、定位;

说到文件io对文件的操作还需要了解文件描述符

	文件描述符:
		1. 一种非负整数(0-1023 共 1024个),内核用于区分 进程打开/访问的文件 的方式
		2. 常见的三种特文件描述符标识: 0 1 2 是被系统占用的(标准输入、 标准输出、标准错误)
		3. 文件io里面:在posix.1应用程序中,幻数0、1、2应被代换成符号常数stdin_fileno、stdout_fileno、stderr_fileno。这些常数都定义在头文件<unistd.h>中。

文件io使用的函数均为系统调用函数;系统调用和库函数关系如下图:
在这里插入图片描述

1、系统调用
1. 用户空间进程访问内核的接口
2. 把用户从底层的硬件编程中解放出来
3. 极大的提高了系统的安全性
4. 使用户程序具有可移植性
5. 是操作系统的一部分
2、库函数
1. 库函数为了实现某个功能而封装起来的api集合
2. 提供统一的编程接口,更加便于应用程序的移植
3. 是语言或者应用程序的一部分
3、文件io常见的api接口
	1、打开文件 ——open函数
		函数原型:
			int open(const char *pathname, int flags, mode_t mode);
	2、关闭文件——close函数
		函数原型:
			int close(int fd);
	3、文件读——read函数
		函数原型:
			ssize_t read(int fd, void *buf, size_t count);
	4、文件写——write函数
		函数原型:
			ssize_t write(int fd, const void *buf, size_t count);
	5、定位——lseek函数
		函数原型:
			off_t lseek(int fd, off_t offset, int whence);

二、标准io

谈到标准io,就得先知道什么是标准io;

(一)、什么是标准io

由c库提供的一组操作文件的接口函数 (在系统io基础上提供了缓冲机制的一组接口)

相比文件io系统io多出了缓冲机制,那先介绍一下缓冲区

1、缓冲的作用

1)存储金子塔
先看一下缓存金字塔,越往上存储速度是越快的;
在这里插入图片描述

2)标准io和缓冲的关系:标准io是把文件数据放到缓冲当中进行操作。避免直接读写磁盘。效率就得到提升。

2、标准io三种缓存机制

标准i/o提供了三种类型的缓存
1. 全缓存
 	刷新(fflush):标准i/o的写操作。
	当填满i/o缓存,或者满足一定的条件后,就会执行刷新操作。
2. 行缓存
	当在输入和输出中遇到新行符(‘\n’)时,进行i/o操作。
	当流遇到一个终端时,典型的行缓存。
3. 不带缓存
	标准i/o库不对字符进行缓冲,例如stderr。
	很多的人机交互界面要求不可全缓存。
	标准出错决不会是全缓存的。
4. 使用setbuf()和setvbuf()可以更改缓存的类型
	在任何时刻,可以使用fflush强制刷新一个数据流
5. 刷新流的3种情况:printf
	刷新流的作用就是将缓冲区的文件数据写入到磁盘,有4种情况会刷新流:
	1)程序结束,自动刷新缓冲区;
	2)调用fclose()关闭了操作的文件,也会刷新缓冲区数据;
	3)当缓冲区数据满时,也会刷新缓冲区文件数据到磁盘;
	4)手动调用函数fflush刷新流。

3、标准io函数接口

标准io使用的函数均为库函数,和文件io 使用的接口函数有所区别

1、打开文件
	fopen、freopen函数
2、关闭文件
	fclose函数
3、读写
	1)按字符读写
			按字符读:
					putchar、fputc函数
			按字符写:
					getchar、fgetc函数
	 2)按行读写
			按行读:
					puts、fputs函数
			按行写:
					gets、fgets函数
	 3)按对象读写	
	 		按对象读:
	 			fread函数
	 		按对象写:
	 			fwrite函数
4、定位
 fseek、 ftell 、rewind函数

三、两者的区别

说了这么多,接下来说说文件io和标准io的区别

文件io
	1. 系统调用的一组 函数接口(偏向内核);
	2. 没有缓存:读写效率较低,低级磁盘io;
	3. 接口较少;
	4. 受限制:在我们linux系统下是可以使用的,但是在windows下是不可以。
	5. 可以打开设备文件 ;

标准io
	1.不能打开设备文件;
	2. 在系统io 基础封装的一组 标准 函数接口(偏向用户);
	3. 由缓存,读写效率较高 (高级磁盘io);
	4. 接口更丰富。

在这里插入图片描述
在这里插入图片描述

上述这些就是我对文件io以及标准io的总结与对比;
关于文件io和标准io各种函数没有展开细讲,可以自己在linux上查询相关函数用法;

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Unix 哲学到底给现代编程带来哪些重要启示?

07-31

C语言UNIX域套接字CS模型

07-31

【supervisor】 问题处理 unix:///var/run/supervisor/supervisor.sock no such file

07-31

解决没有足够权限访问Docker守护进程的问题permission denied while trying to connect to the Docker daemon socket at unix

07-31

docker报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the d

07-31

【已解决】Cannot connect to the Docker daemon at unix:///var/run/docker.sock.

07-31

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论