linux之基础IO

本文深入探讨了Linux下的文件输入输出操作,包括标准库的IO接口和系统调用IO接口。详细介绍了fopen、fwrite、fread、fseek、fclose等库函数的使用,以及open、read、write、lseek、close等系统调用。文件描述符的概念、重定向的原理和文件系统的运作机制也得到了阐述。此外,还提到了软链接和硬链接的区别及其在文件删除时的影响。最后,讨论了库文件(动态库和静态库)的打包与实现。

基础IO


基础IO:
文件的输入输出操作–回顾标准库的IO接口/学习linux下系统调用IO接口/文件描述符的理解/重定向的理解/文件系统/库文件

回顾标准库的IO接口–都是库函数–库函数就是对系统调用接口的封装:fopen/fwrite/fread/fseek/fclose
fopen–打开一个文件 FILE *fopen(char filename,char mode);(文件名称,打开方式)
打开方式:“r-只读 r±读写 w-只写 w±读写 a-追加写 a±追加读写 b-二进制操作”
追加写:每次写入数据总是写入到文件末尾
r+的读写和w+的读写有什么区别?
r+读写打开文件,若文件不存在则报错/w+读写打开文件,若不存在则创建,若存在则清空原有内容
a 不仅仅是追加写,并且文件不存在还会创建新文件
b 如果不指定b,则认为问件事文本操作,加上b则认为是二进制操作;区别在于:有时候一个特殊字符,只是一个字符但是占据两个字节的内存(读取一个100字节大小的文件,文本操作最终读取出来的数据,不一定是100个字节)
返回值:返回一个FILE
的文件流指针作为文件的操作句柄;失败返回NULL
fread–size_t fread(char buf,size_t block_size,size_t block_count,FILE fp)
(缓冲区,块大小,块个数,文件流指针)
fwrite–size_t fwrite(char data,size_t block_size,size_t block_count,FILE fp)
(数据首地址,块大小,块个数,文件流指针)
注意:fread/fwrite操作的数据实际大小是块大小
块个数;块大小 = 10,块个数 = 2;意味着要写入/读取20个字节的数据
返回值:返回实际操作的块个数
例如:读取一个文件size = 10,count = 2;
如果文件大小足够则返回2/但是文件大小不足20.则返回1,因为第二块没有读满
int fseek–跳转文件读写位置(FILE *fp,long offset,int whence);(将文件的读写指针从whence位置偏移offset个字节)
int fclose(FILE *fp);关闭文件流指针,释放资源

学习linux下系统调用IO接口:open/read/write/lseek/close
int open(char *filename,int flag,mode_t mode);
filename:要打开的文件名称
flag:选项参数–文件的打开方式 必选项/可选项
必选项(只能选其一): O_RDONLY-只读 O_WRONLY - 只写 O_RDWR-读写
可选择:O_CREAT-文件存在则打开,不存在则创建;
O_EXCL-与O_CREAT同时使用,文件存在则报错,不存在则创建
O_TRUNC-打开文件的同时清空原有内容;
O_APPEND-追加写,总是将数据写入到文件末尾
mode:权限—如果使用了O_CREAT有可能创建新文件,就一定指定文件权限,八进制数字形式
返回值:一个非负整数–文件描述符–文件的操作句柄;失败了返回-1

ssize_t write(int fd,char *data,size_t len);
fd:open返回的文件描述符–文件的操作句柄–通过这个fd指定要往那个文件写入数据
data:要写入文件的数据的首地址
len:要写入文件的数据长度
返回值:返回实际写入文件的数据字节长度,错误返回-1

ssize_t read(int fd,char *buf,size_t len);
fd: open返回的文件描述符
buf: 从文件中读取数据放到哪块缓冲区中的首地址
len:想要读取的数据长度,注意这个len不能大于缓冲区的大小
返回值:返回实际读取到的数据字节长度,错误返回-1

off_t lseek(int fd,off_t offset,int whence);
fd:open返回的文件描述符
offset:偏移量
whence:从哪里开始偏移 SEEK_SET-文件起始位置 SEEK_CUR-文件当前读写位置 SEEK_END文件末尾
返回值:唱功返回当前位置相对于起始位置偏移量;失败返回-1

int close(inyt fd);–通过文件描述符关闭文件,释放资源

文件描述符:是一个非负整数–操作文件的句柄
文件描述符其实就是内核中的一个进程打开文件描述信息表的下标–通过这个下标可以在内核中找到相应的文件描述信息,通过这个描述信息可以实现文件的操作
为什么打开一个文件,如果不操作了一定要关闭?
文件描述符有限,若不关闭文件,如果文件描述符用光,就不能再打开其他文件

文件描述符和文件流指针的关系:
文件描述符:是一个非负整数–系统调用的IO接口
文件流指针:FILE结构体–typedef struct _IO_FILE FILE 库函数IO接口的句柄操作
通文件流指针进行最终文件操作的时候,依然还要能够找到对应的文件描述符才可以,文件流指针是一个结构体,结构体中有很多成员变量,其中就有一个叫做_fileno–这就是文件描述符

向文件写入数据,并不会直接写入文件,而是先写入缓冲区中,刷新缓冲区的时候才会写入文件;系统调用接口是直接将数据写入文件的,系统调用接口是没有这个缓冲区的,只有库函数才存在这个缓冲区

重定向:描述符的重定向,通过改变描述符所指向的文件信息,进而改变当前描述符所操作的文件,最终改变数据流向

文件系统:文件系统就是磁盘上管理文件的系统
文件的存储流程:通过超级块找到inode位图/数据块位图,通过数据块位图快速找到空闲的磁盘块存储文件数据,通过inode位图快速找到空闲的inode节点存储文件的原信息;–文件数据存储完毕;每个文件都有惟一的inode节点;
linux下文件的数据和文件的名称是分离的
文件的数据存储完毕后,还需要在这个额文件的目录下(文件目录中),记录这个文件名称以及inode节点号(目录项);
获取文件数据流程:通过文件名打开一个文件,在所在目录文件中通过文件名找到这个文件的inode节点号,在超级磁盘区域中找到inode区域,根据inode节点号,快速找到inode节点,得到数据存储的磁盘块号,取出数据
软链接文件/硬链接文件:给源文件创建一个软链接文件/硬链接文件,通过这个软链接/硬链接文件来操作源文件;
为源文件创建一个硬链接文件:ln test.text test.hard
为源文件创建一个软链接文件:ln -s test.text test.soft
软链接文件和硬链接文件的区别
硬链接文件:本质上和源文件没有什么不同,都是一个文件的名称,与源文件共用同一个inode节点,通过自己的inode节点访问源文件数据
软链接文件:本质上是一个独立的文件,有自己的inode节点,文件数据中保存源文件的路径,通过这个路径访问源文件的数据
删除源文件,软链接文件会失效,硬链接文件只是链接数-1;删除一个文件,文件并不会立即被删除,而是之即删除目录项信息,inode中的链接数-1,之后链接数为0时,才会真正删除文件;
链接数–一个inode节点对应有几个目录项
软链接文件可以跨分区,硬链接文件不可以。
软链接文件可以对目录创建,硬链接文件不可以

动态库/静态库的打包与实现
库文件:打包了一堆实现了常用功能的代码文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值