Liunx-基础IO

一、C语言操作文件接口

  • FILE *fopen(const char *path,const char *mode) ;

path :待打开的文件(文件路径+文件名称)
mode :以何种方式打开
r:以只读方式打开,当文件不存在的时候,就会打开失败
r+:以读写方式打开,当文件不存在的时候,就会打开失败
w:以只写方式打开,如果文件不存在,则创建文件。如何文件存在,则会截断(清空)文件
w+:以读写方式打开,如果文件不存在,则创建文件。如何文件存在,则会截断(清空)文件
a:以追加方式打开,只支持写,如果文件不存在,则创建文件。当前的文件流指针指向了文件的末尾
a+:以追加方式打开,支持读和写。如果文件不存在,则创建文件。当前的文件流指针指向了文件的末尾
返回值:打开成功返回文件流指针,打开失败返回NULL

  • size_t fwrite(const void ptr,size_t size,size_t nmemb,FILEstream) ;

ptr :要往文件当中写的内容
size : 写入块的大小,单位是字节
nmemb :块的个数,单位是个
写入的字节数量: size *nmemb
注意:一般在程序当中使用的时候,是将size设置成为1,则nmemb就表示写入的字节数量
stream:文件流指针
返回值:返回写入成功块的个数,切记!!!不是写入成功字节的数量

  • size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);

ptr :要将读到的内容保存在哪里
size :每次读块的大小
nmemb :块的个数
stream :文件流指针
返回值:成功读到的块的个数

  • int fseek(FILE *stream,long offset,int whence) ;将文件的读写指针从whence位置偏移offset字节

stream :文件流指针
offset :偏移量
whence :
SEEK_SET:文件流指针偏移到文件头部
SEEK_CUR:文件流指针偏移到当前位置
SEEK_END:文件流指针指向文件末尾位置

  • int fclose(FILE*fp) :关闭文件流指针

fopen,fwrite,fread,,fseek,fclose这些函数都是库函数,是C库当中提供能给程序员调用的函数
open, write,read,lseek,close这些函数都是系统调用,是操作系统内核为程序员提供的函数

二、系统调用函数的操作文件接口

  • int open(const char *pathname,int flags,mode_t mode) :

pathname :要打开的文件名称(路径+名称)
flags :以何种方式打开
必须的宏,三个宏有且只能出现一个
O_RDONLY:只读方式
O_wRONLY : 只写方式
O_RDWR :读写方式
可选的宏
O_APPEND :追加,总是将数据写入到文件末尾
O_TRUNC :截断 (清空)
O_CREAT:文件不存在则创建 ,存在则打开
使用的方式,必须的宏和可选的宏之间使用按位或的方式
eg: O_RDWR | o_CREAT
mode :权限
新创建出来的文件设置权限 传参的时候,传递8进制数字就可以了
返回值: 打开成功,返回大于等于0的数字,是文件描述符打开失败,返回-1

按位或:两个比特位当中只要有一个为1,则为1
1.O_RDONLY八进制的0
2.O_WRONLY八进制的1
3.O_RDWR八进制的2
4.O_CREAT

  • ssize_ t read(int fd, void *buf,size_ t count) ;

fd :文件描述符, open的返回值
buf:要将读到的内容放到哪里去
count :最大可以读多少个,单位字节
返回值:返回读到的字节数量

  • ssize_ t write(int fd,const void *buf,size_ _t count) ;

fd :文件描述符, open的返回值
buf :往文件 当中写的内容
count : 写的内容的大小
返回值:写成功的字节数量

  • off_ t lseek(int fd, off_ t offset, int whence) :

fd:文件描述符
offset :偏移量
whence :
SEEK_SET:文件流指针偏移到文件头部
SEEK_CUR:文件流指针偏移到当前位置
SEEK_END:文件流指针指向文件末尾位置

  • int close(int fd) :关闭文件描述符

三、文件描述符

1、文件描述符就是内核中一个进程打开的文件描述信息表的下标-----通过这个下标可以在内核中找到相应的文件描述信息,通过这个描述信息可以实现文件的操作
2、为什么打开一个文件如果不操作了一定的关闭,释放资源;文件描述符实际上是有限的;若不关闭文件,文件描述符用光,则在进程中就打不开新文件,会造成文件句柄泄漏
3、操作会为每一个进程在磁盘当中创建一个以进程号命名的文件夹,在该文件夹下有一个fd文件夹,保存的信息为该进程打开的文件描述符信息
4、当我们新创建出来的一个进程,势必会打开3个文件描述符,分别对应,标准输入(0) , 标准输出(1) ,标准错误(2)
5、文件描述符其实就是内核当中的fd_ array数组的下标
6、文件描述符是一个 正整数,分配原则为最小未占用原则
在这里插入图片描述

四、文件描述符&文件流指针的区别

1.文件流指针是fopen函数返回的,文件流指针是属于C库在维护的
2.文件描述符是open函数返回的,文件描述赋予是内核在维护的
3.不同的文件流指针,在C库的当中当中会创建不同的struct_ I0_ FILE, 在_ I0_ FILE结构体当中保存了不同的文件描述符
4.文件流指针当中包含文件描述符,通过文件流指针进行最终文件操作的时候,依然还要能够找到文件对应的文件描述符才可以,文件流指针中的_fileno-----就是文件描述符
5.操作系统当中广泛存在缓冲区,但是如果针对文件流指针而言的缓冲区,是C库在维护的
exit函数在退出的时候,会刷新缓冲区,就是因为操作的是文件流抬针
_exit函数在退出一个进程的时候,不会刷新该缓冲区,是因为该缓冲区是C库在维护的,内核并不知道,所以不会刷新
6、向文件写入数据,不会直接写入文件,而是先写入缓冲区中,刷新缓冲区的时候才会写入文件
在这里插入图片描述

五、重定向:

1、将数据不再写入原本的文件,而是写入新的指定文件中----实现方式就是替换这个描述符对于的文件描述信息,实际是描述符的重定向,改变描述符所指向的文件,就改变了数据的流向
2、命令感受: .
清空重定向">”
追加重定向">>”
3、int dup2(int oldfd, int newfd) ;描述符重定向函数,让newfd这个描述符也指向oldfd所指向的文件,这个oldfd和newfd都能够操作oldfd所指向的文件

六、动态库和静态库

命令1: ldd[可执行程序]:查看当前程序依赖的动态库文件
C动态库:libc.so.6 =>/usr/lib64/libc.so.6 (ox00007f1d4c53e000)
命令2: file [可执行程序]:可以查看文件的属性
1、动态库

  • 生成
    1、gcc/gtt
    2、-shared -fPIC
    3、-o后面生成的动态库的名字
    前缀: lib
    后缀: .so
    libabab.so==>abab称之为动态库的名字
  • 使用
    在这里插入图片描述

2.静态库

  • 前提知识:
    win下的静态库的后缀为.lib
    win下的动态库的后缀为.dll
  • 生成
    前缀: lib
    后缀: .a
    libabab.a==>abab就是静态库的名字
    ar -rc lib[名字].a「依赖的文件]
    依赖文件不是源文件!!,而是.o文件!!
  • 使用
    main.c
    func() ==>libfunc.a
    gcc main. c -o main -L [path] -l[静态库的名字]

七、文件系统

在这里插入图片描述

  • 线性存储方式可能会导致磁盘的利用率降低,产生磁盘碎片

  • 离散存储方式会提高程序对磁盘的利用率

  • block Bitmap:本质是一个位图,每一个比特位表示Data blocks当中块的使用情况,如果比特位为1,则表示占用,如果为0,则表示空闲

  • Data blocks:实际存储文件的blocks区域,这个区域当中,将磁盘分成了不同的小block

  • inode Bitmap:本身也是一个位图,每一个比特位表示inode table当中inode块的使用情况,如果比特位为1,则表示占用,如果为0,则表示空闲

  • inode Table:inode节点的集合, inode节点描述了文件的存储情况(文件在哪些block块当中存储的)

1.文件的存储

  • 去Block Bit Map区域查找空闲的block块,将文件存储在空闲的block块当中
  • 通过inode BitMap获取空闲的inode节点,通过inode节点去描述文件在DataBlock区域当中存储的位置
  • inode+文件名称作为目录的目录项保存下来

2.文件的获取

  • 通过文件名称和inode节点号找到inode对应的文件信息
  • 在Data blocks区域当中获取当前文件存储的内容,在进行拼接,拼接完成之后就是文件内容了

3、软/硬链接

  • 软链接:
    1.软链接文件就相当于一个文件的快捷方式
    2.ln -s[源文件]「生成的软链接文件]
    3.软链接文件具有独立的inode节点号
    4.在删除软链接文件或者软链接文件指向的源文件的时候,一定将两者都删除掉
  • 硬链接:
    1.ln[源文件][生成的硬链接文件]
    2.源文件和硬链接文件的inode节点号是一模一样的
    3.硬链接文件除了和源文件的名称不一样,其他的都一样;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值