IO接口

一.系统调用IO接口的认识与使用
系统调用IO接口:open read write lseek close
对应头文件:#include <fcntl.h>
man手册:1-命令 2-系统调用接口 3-库函数
1.open
int open( char *filename, int flags,int mode);

(1) filename要打开的文件名
(2)flag:访问方式
必选项: O_RDONLY 只读 O_WRONLY只写 O_RDWR读写
可选项:O_CREAT文件不存在则创建;
O_EXCL通常与O_CREAT同时使用,文件不存在则创建,存在则open报错返回;
O_APPEND再写入时以追加写的方式写入
O_NONBLOCK设置非阻塞
O_TRUNC在打开文件的同时清空文件内容
(3) mode:文件的打开方式,文件的创建权限----在使用O_CREAT时这个参数必须要有
(4)返回值:成功返回一个非负整数----文件描述符;失败返回-1
文件描述符:系统调用IO接口的操作句柄
(5)umask(0)将当前进程文件创建权限设置为0

2.write
size_t write(int fd,char*data,int count);

(1)fd:open返回的文件描述符(一个进程可能打开多个文件,通过fd确定操作的是哪个文件)
(2)data:写入文件的数据的首地址
(3)count:要写入的数据长度
(4)返回值:实际写入文件的字节长度(写入数据时可能出现部分写入成功),失败返回-1

3.read
ssize_t read(int fd,charbuf,charcount);

(1) fd;文件描述符
(2)count:要读取的数据长度
(3)返回值:成功返回实际读取到的数据的字节长度;失败返回-1

4.lseek
off_t lseek(int fd,off_t offset,int whence);

(1) fd;文件描述符
(2) offset:相对于whence位置的偏移量
(3)whence:SEEK_SET起始位置/SEEK_CUR当前位置/SEEK_END末尾位置
(4)返回值:跳转后的位置相对于文件起始位置的偏移量(有时候用于跳转到文件末尾求文件长度)

5.close
int close(fd);
linux下的系统调用IO接口操作文件打开方式中,并不区分文本操作与二进制操作,默认全部以二进制进行
二.标准库IO接口
标准库IO接口:fopen,fwrite,fread,fseek,fclose
1.fopen
FILEfopen(charfilename,char*mode)
fopen打开文件默认是文本操作

r只读,若文件不存在则打开失败
r+读写
w只写 如果文件不存在就会创建,若存在则清空内容
w+读写
a追加写数据总是写入文件末尾,文件不存在则会创建
a+读追加写
b对文件数据进行二进制操作

2.fwrite
size_t fwrite(chardata,size_t block_size,size_t block_num,FILEfp);

data:要向文件中写入数据
block_size 块大小
block_num 块个数
block_size*block_num:就是要写入文件的数据大小
fp:fopen返回文件的操作句柄——文件流指针
返回值:实际操作的块个数,失败返回0;

3.fwrite
size_t fread(charbuf,size_t block_size,size_t block_num,FILEfp);

返回值:实际操作块个数,失败返回0;
文件读写位置指针:指向文件当前即将写入或读取的位置(相对于起始位置的偏移量)
使用r/r+/w/w+的时候,打开文件,则读写位置指针默认指向文件的起始位置
返回值为0有两种情况:(1)读到文件末尾位置(2)出错了

4.fseek
int fseek(FILE*fp,int offset,int whence);

fp:文件的操作句柄
offset:一个相对于whence位置的偏移量
whence:SEEK_SET起始位置/SEEK_CUR当前位置/SEEK_END末尾位置
返回值:成功返回0,失败返回-1

三.文件描述符与文件流指针
1.文件描述符:

open返回的int fd,系统调用IO接口的操作句柄,非负整数;实际上就是内核中的文件描述信息数组的下标

2.文件流指针:

fopen返回的FILE*fp,标准库IO接口的操作句柄;文件流指针是个结构体,内部封装了文件描述符成员

3.库函数与系统调用接口的关系

:系统调用接口是操作系统向上提供的访问内核的接口,库函数是针对典型的应用场景对系统调用进行封装后的接口函数 库函数封装了系统调用接口

四.重定向实现
1.重定向:改变数据的流向,在不改变操作的文件描述符的情况下,让原本写入A文件的数据写入到B文件
2.原理:改变文件描述信息
3.int dup2(int oldfd,int newfd);
newfd和oldfd均保存oldfd的文件描述信息,两者皆可以指向oldfd所指向的文件
4.>>追加重定向 >清空重定向
在命令中解析>或者>>符号:跌倒三个信息(命令,重定向的方式,重定向的文件)
五.动态库与静态库的生成与使用
1.库文件:二进制代码实现的集合文件
2.动态库与静态库的区别:
生成可执行程序连接动态库:只是将动态库中的函数信息表记录到可执行程序中,这种方式生成的可执行程序中没有具体代码的实现,运行时就必须依赖库的存在
生成可执行程序连接静态库:将静态库中使用到的代码全都写入到可执行程序,这种方式生成的可执行程序中拥有所有代码实现,自己就可以单独运行
3.库的生成:将大堆代码实现打包生成一个库文件(代码中不能包含main函数
(1)将当前的各个.c文件生成各自的.o文件
(2)将所有.o文件以及使用到的库文件进行打包生成我们自己的库文件
将当前的各个.c文件生成各自的.o文件 gcc -c filename.c -o filename.o
动态库:gcc -fPIC -c filename.c -o filename.o
gcc --shared filename1.o filename2.o…-o lib***.so
静态库:gcc -c filename.c -o filename.o
ar -cr lib***.a filename.o filename.o…
(3)使用:生成可执行程序时的链接使用,
运行可执行程序时的加载使用(仅仅针对动态库)
a.生成可执行程序时的链接使用,使用的是gcc编译器,在生成可执行程序时,使用-l选项指定要链接的库文件的名称
gcc编译器在生成可执行程序时,假如连接了库文件,就会默认去指定的一些路径下找到这些库文件

*将库文件放到默认的指定路径下 /lib或/lib64
*环境变量LIBRARY_PATH保存默认查找路径,将库文件所在路径添加到环境变量中export LIBRARY_PATH=${LIBRARY_PATH};
*使用gcc编译选项-L指定库文件所在路径 gcc main.c -o main -lchild -L/(常用)

b.运行可执行程序时的加载使用
加载时,就会默认到指定的路径下去找这个库文件

1.将库文件放到指定的路径 /lib64
2.环境变量 LD_LIBRARY_PATH保存加载路径

六.文件系统
1.文件存储流程:

(1)在超级块中获取文件系统信息(各区域起始位置),找到位图区域
(2)根据位图信息,找到空闲的inode节点,以及空闲的数据块
(3)存储数据到数据块中,存储文件的元信息保存至inode节点中
(4)将文件名与文件的inode节点号,作为对应信息(目录项)保存至所在目录文件中

2.文件数据获取流程

(1)通过文件的路径名,打开文件所在目录文件,获取到文件的目录项(得到文件的inode节点号)
(2)通过inode节点号,找到文件的inode节点,获取到文件数据存储的磁盘块号
(3)在指定磁盘块中取出数据

3.软连接文件和硬链接文件
都是针对源文件而创建的,访问这两种文件就相当于访问源文件

本质区别:软连接文件是一个独立的文件,有自己的inode节点,通过保存源文件的路径访问源文件;硬链接文件与源文件没有太大区别,都是一个文件的目录项,拥有相同的inode节点号,通过自己的inode节点号访问文件数据

衍生区别:(1)删除源文件,则软连接文件会失效,但是硬链接文件不受影响 (2)软连接文件可以跨分区建立,但是硬链接文件不可以
(3)软连接文件可以对目录创建,但是硬链接文件不可以

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值