Linux:基础IO
Posted 银背欧尼酱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux:基础IO相关的知识,希望对你有一定的参考价值。
前言
本文将为大家介绍基础IO的相关知识,让我一起来学习吧。
一,复习C语言当中学习的文件接口操作
FILE *fopen(const char *path,const char *mode);
path:待要打开的文件
mode:以何种方式打开
r:可读方式打开
r+:可读可写方式打开
w:可写方式打开
w+:可读可写方式打开,如果文件不存在,则创建文件。如果是打开了一个已经存在的文件,则截断文件(清空文件内容)
a:追加写,但是不可以读。如果文件不存在则创建文件,如果文件存在,则在文件的末尾开始追加写。
a+:追加写,可以读。如果文件不存在则创建文件,如果文件存在,则在文件的末尾开始追加写。
返回值:
成功:返回文件流指针FILE
失败,则返回NULL
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
ptr:将从文件读到的内容保存在ptr指向的空间当中
size:定义读文件时,一个块的大小,单位为字节
nmemb:期望可以从文件中读多少块
stream:文件流指针
返回值:
返回的是真正读取到块的个数
常见用法:将一块的大小定义为1字节,nmemeb就可以代表我们期望读多少字节,返回的含义,也是读到了多少字节。
size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream);
ptr:想往文件中写什么内容
size:定义往文件中写的块的大小,单位为字节
nmemb:期望写多少块
stream:文件流指针
返回值:
返回成功:写入到文件当中块的个数
常见用法:将一块的大小定义为1字节,nmemeb就可以代表我们想写多少字节,返回值为成功写入的字节数量
int fseek(FILE *stream,long offset,int whence);
stream:文件流指针
offset:偏移量
whence:将文件流指针偏移到什么位置
SEEK_SET:定义文件流指针到文件头部
SEEK_CUR:定义文件流指针到当前位置
SEEK_END:定义文件流指针到文件末尾
作用:移动文件流指针指向的位置
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
系统调用的文件操作接口:
打开的文件存在,则使用下面的接口
int open(const char *pathname,int flags,mode_t mode);
pathname:待要打开的文件
flags:以何种方式打开,有且只能存在一种,并且必须有
0_RDONLY:只读方式
0_WRONLY:只写方式
0_RDWR:读写方式
可选项:
0_TRUNC:截断文件(清空文件内容)
0_CREAT:文件不存在则创建文件
0_APPEND:追加的方式
0_EXCL | 0_CREAT : 如果文件存在,则打开文件失败
使用按位或的方式进行组合
0_RDWR | 0_CREAT | 0_APPEND
本质上内核是使用位图的方式来表示每一种方式的
mode:当创建或打开一个新文件时,则需要给文件设置权限,设置权限的时候,则传递一个8进制的数字就可以了
返回值:
成功:返回一个文件描述符
失败:返回-1
ssize_t read(int fd,void *buf,size_t count);
fd:文件描述符
buf:将文件内容读到buf指向的空间当中
count:期望读多少字节
返回值:
返回读到的字节数量
ssize_t write(int fd,const void *buf,size_t count);
fd:文件描述符
buf:将buf指向的内容写到文件中去
count:期望写多少字节
返回值:
返回写入的字节数量
off_t lseek(int fd,off_t offset,int whence);
fd:文件描述符
offset:偏移量
whence:
SEEK_SET:定义文件流指针到文件头部
SEEK_CUR:定义文件流指针到当前位置
SEEK_END:定义文件流指针到文件末尾
二,文件描述符
文件描述符本质上就是一个整数,是一个从0开始的整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件,于是就有了file结构体,表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每一个进程都有一个指针*files,指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针。所以,本质上,文件描述符就是files_struct包含数组的下标。所以只要拿着文件描述符,就能找到对应的文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UhG2jUVA-1628669830113)(https://i.loli.net/2021/08/11/1EstfVcWAJFpYjN.png)]
默认的三个文件描述符:标准输入0,标准输出1,标准错误2。一个文件流指针只能保存一个文件描述符。
三,静态库和动态库
静态库和动态库都是程序代码的集合,将代码集合封装在了库文件当中,提供给调用者使用:
动态库:
特征:
win : 后缀为 .dll
linux : 前缀 : lib 后缀为: .so
生成:
使用gcc/g++编译命令,需要用到两个命令行参数
—fPIC : 产生位置无关的代码
—shared : 产生共享库
使用:
gcc/g++的命令行参数:
-L [path] : 指定当前链接库文件所在路径
-l[库文件名称(去掉前缀,去掉后缀的名称)]:链接某个库文件
动态库的环境变量:
LD_LIBRARY_PATH
都有哪些方式可以使自己的可执行程序找到自己依赖的动态库
1.将动态库放到可执行程序的路径下
2.配置LD_LIBRARY_PATH环境变量(临时)
3.放到系统库的路径下,/lib64 :对系统环境变量进行操作,极其不推荐
静态库:
特征:
win : 后缀为 .lib
linux : 前缀 : lib 后缀为: .a
生成:
注意点:使用目标程序进程编译生成
第一段:使用gcc/g++将源代码编译成为目标文件(.o文件)
第二段:使用ar -rc命令编译目标文件生成静态库
总结
以上就是本文内容,希望对大家有所帮助。
以上是关于Linux:基础IO的主要内容,如果未能解决你的问题,请参考以下文章