Linux下的IO操作

Linux下的IO操作

C语言中的IO操作

函数 描述
fopen 打开一个文件
fwrite 向指定文件写入数据
fread 从文件读取数据
fseek 指定当前文件下的光标位置
fclose 关闭一个文件(注意,在文件试用网完毕后要关闭文件,避免造成资源泄漏)

example:
向文件写入数据:
Linux下的IO操作_第1张图片
Linux下的IO操作_第2张图片

从文件读取数据
Linux下的IO操作_第3张图片
Linux下的IO操作_第4张图片

输出数据到终端:
Linux下的IO操作_第5张图片
Linux下的IO操作_第6张图片
文件打开方式的总结:

打开方式 描述
r 只读方式打开
r+ 读写方式打开,文件不存在则报错,文件存在则清空原有内容
w 只写方式打开
w+ 读写方式打开,文件不存在则创建,文件存在则清空原有内容
a 追加方式打开
a+ 读和追加方式打开,文件不存在则创创建,文件存在则在文件的结尾部分追加写
b 表示二进制文件写入读取追加
t 表示文本文件写入读取追加

Linux系统下的IO操作

接口:

#include 
#include 

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

pathname:要打开或创建的文件

flags 描述
O_CREAT 文件不存在则创建
O_RDONLY 只读方式打开
O_WRONLY 只写方式打开
O_RDWR 读写方式打开
O_APPEND 追加方式打开
O_EXCL 搭配O_CREAT使用
O_TRUNC

mode:设置文件的权限设置之前要加上umask(0)来临时置空系统默认权限位

Linux下的IO操作_第7张图片
Linux下的IO操作_第8张图片
Linux下的IO操作_第9张图片
Linux下的IO操作_第10张图片

文件描述符fd

文件描述符:
Linux下的IO操作_第11张图片
如图所示,系统对程序的描述是一个task_struct结构体,在结构体中有一个files指针,这个指针指向一个file_struct结构体,在这个结构体中存在fd_array[]数组,这个数组的下标 就是文件描述符fd,通过这个下标,我们可以访问到这个文件。进而对文件进行操作。
文件描述符的分配规则:
文件描述符是按照从前往后找,找到第一个没有被分配的下标做为该文件描述符。
Linux下的IO操作_第12张图片

Linux下的IO操作_第13张图片

Linux下的IO操作_第14张图片
0代表标准输入,1代表标准输出, 2代表标准错误

重定向

当标准输出的文件描述符被关闭时,本该输出到终端的输出被输出到1号描述符描述的文件中去了,这种现象称之为输出重定向。
常见的重定向有:>> , >, <

Linux下的IO操作_第15张图片
Linux下的IO操作_第16张图片
Linux下的IO操作_第17张图片

printf和fwrite库函数自带缓冲区,而write系统调用接口没有提供缓冲区。

文件描述符和文件流指针的关系:

文件流指针FILE是一个结构体,成员就是文件描述符
库函数封装了系统调用接口,因此,库函数的调用归根结底是系统调用接口的使用
我们通常所说的是缓冲区也就是文件流指针结构体中定义的缓冲区。这个缓冲区通常被称为用户态缓冲区。

动态库和静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候不需要静态库
动态短库(.so)程序在运行的时候链接动态库中的代码,多个程序共享使用库的代码
动态库链接只链接包含它用到的函数入口地址的一个表
动态库更加节省磁盘空间

动态链接静态链接的生成方式:
Linux下的IO操作_第18张图片
静态库的打包:

//生成汇编代码
gcc -c [.c文件] -o [.o文件]
//静态库打包
ar -cr lib[静态库名称].a [.o文件]

静态库的使用:

生成可执行程序时链接使用:

1、将库文件放在指定路径下 /usr/lib64 /usr/lib
2、设置链接库的搜索路径环境变量 export LIBRARY_PATH=$LIBRARY_PATH:.
3、使用gcc [.c文件] -o [目标文件] -L[path] -l[库名称]

动态库的打包:

//生产汇编代码
gcc -c -fPIC [.c文件] -o [.o文件]
//动态库打包
gcc -shared [.o文件] -o lib[动态库名称].so

-fPIC选项是产生位置无关代码
动态库的命名方式lib***.so

查看动态库的目录列表:

动态库的使用:

运行时可执行程序时加载使用:

1、将库文件放在指定路径下 /usr/lib64 /usr/lib
2、设置链接库的搜索路径环境变量 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

Linux下的IO操作_第19张图片
Linux下的IO操作_第20张图片

文件系统

命令:

ls -l
stat [文件名称]

功能:

查看文件列表,查看文件的详细信息

Linux下的IO操作_第21张图片
ls -l包含的信息:
1、模式
2、硬链接数
3、文件的所有者
4、文件的所属组
5、文件的最后一次修改时间
6、文件的大小
7、文件名称
Linux下的IO操作_第22张图片
stat [文件]包含的信息
文件名称,文件大小,文件的块大小,文件的IO块大小,文件类型
文件的所属设备,文件的Inode节点,文件的硬连接数,文件的权限,文件的所有者id,文件的所属组id文件所处环境
文件的最近修改,最近访问,最近改动时间
Inode:
Inode包含文件的源信息
1、文件的字节数
2、文件的所有者
3、文件的所属组
4、文件的读写执行权限
5、文件的时间戳,ctime Inode的创建时间,mtime文件内容上一次修改时间,atime文件最后一次访问时间
6、文件的链接数
7、文件数据的block位置
Linux下的IO操作_第23张图片

目录项:
目录下的文件名和文件的Inode节点号

查找文件的流程:
打开目录文件,读取目录项信息,通过文件名找到文件的Inode节点号->通过Inode节点号找到文件系统在Inode区域中的Inode节点,再通过Inode节点储存的文件数据储存位置,找到文件在数据区域存储的数据

创建一个新文件的操作:
1、储存属性:内核先找一个空闲的节点,把文件信息记录到其中
2、数据储存:将信息分块记录在不同的磁盘块中
3、记录分配情况:内核在Inode的磁盘分布区间记录存放块位置顺序
4、添加文件名称到目录项:内核将入口添加到目录,文件名和Inode之间的对应关系将文件名和文件的内容及书写连接起来。

软链接和硬链接

硬链接:
硬链接就像是文件的别名,它有自己的目录项,但是没有单独的Inode节点和数据区,一个文件每多一个硬链接,它的Inode节点的 链接数就会+1,这个Inode节点对应多个不同名称的文件,可以通过任意一个文件名称访问这个文件,每删除一个文件,该文件的Inode节点的链接数就会-1,当链接数为0的时候,这个文件才被真正的删除。
因此,删除源文件,我们依然可以访问到这个文件,当且仅当这个文件的链接数>0
创建硬链接的方法:
命令:

ln [源文件] [硬链接文件]

功能:

为指定文件创建硬链接

Linux下的IO操作_第24张图片
软链接:
软链接是一个独立的文件,有自己的目录项,Inode节点,数据区。可以理解为是源文件的快捷方式(注意,这里提到的快捷方式并不准确,并不是Windows系统下的那个快捷方式)通过软链接文件可以访问到源文件,当源文件被删除时,这个软链接将不再访问到源文件。
命令:

ln -s [源文件] [软链接文件]

功能:

为文件创建软链接

Linux下的IO操作_第25张图片

软链接和硬链接的区别

区别项 软链接 硬链接
是否针对目录 可以 不可以
是否产生新文件 是新文件 是源文件的别名
是否跨分区 可以跨分区 不可跨分区(每个文件系统都有自己的文件系统的划分的超级快,Inode位图和data位图,以及Inode节点和data数据)
删除源文件是否可以继续访问 不可以访问 无影响,除非链接数<0

你可能感兴趣的:(Linux下的IO操作)