更多知识点:linux目录索引
系统文件IO
#include<fcntl.h>
int open(const char* pathname,int flags);
int open(const char* pathname,int flags,mode_t mode);
pathname:要打开或者创建的目标文件
falgs:
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:写读
O_CREATE:创建文件
注:三选一
返回值:fd
从小到大找第一个没有被使用的分配
查看已打开的文件描述符:/proc/pid/fd
通过open打开一个文件,返回一个整数,通过这个整数就可以操作文件,这个整数我们称之为文件描述符(fd)
打开文件是一种系统资源,fd到底可以打开多少文件
如何查看当前进程最多可以打开多少文件?
ulimit -n (nz值可以修改)
ulimit -n 2048 :修改为2048个文件
系统到底可以打开多少个文件?
和内存有关,1G内存大概可以打开10万个
cat /proc/sys/fs/file-max
open函数
int open(const char *pathname,//需要打开的文件名
int flags);// O_RDONLY
O_WRONLY//这三个必须只能选一个
O_RDWR
返回文件描述符,从小到大找到第一个没有被使用的分配
/proc/pid/fd/ 可以查看已经被打开的文件描述符
int open(const char *pathname, int flags, mode_t mode);
write函数
ssize_t write(int fd,
const void* buf,//向文件输入的数据位置
size_t len);//数据个数
注:如果原文件有内容,不会清空文件;如果想要清空源文件,用O_TRUNC
注:fsync
write是用户写到内核的函数,不会将数据刷新到磁盘中去
使用fsync可将数据立即刷新到磁盘中去
例子:
read函数
//读取磁盘/设备数据
ssize_t read(int fd,//打开的文件描述符
void* buf,//用户准备的缓存区
size_t size)//缓存区大小
随机读写:定位文件当前的读写位置
off_t lseek(int fd,
off_t offset,//偏移量
int where);//基准位置SEEk_SET,SEEK_CUR,SEEK_END
offset大于0,向后移动单位数,小于0,向前移动
返回值为当前位置
作用:求的文件大小
例:跳着跳着读文件内容
输出重定向
文件描述符:
文件描述符就是从0开始的最小整数,当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,必须让进程和文件关联。每个进程都有一个文件指针,指向一张表FILE_STRUCT,表中存放的是一个个指针数组,数组中的元素是指向打开文件的指针。而文件描述符就是数组的下标。拿着文件描述符就可找到文件
dup函数
int dup(int old)
复制old文件描述符给新的文件描述符,返回新的文件描述符
选择新的文件描述符规则:从小到大选择第一个没有被使用的文件描述符
输出重定向原理
当关闭文件描述符1(即标准输出)时,系统去找没有被使用最小的文件描述符,找到1,故将1号文件描述符给了myfile.txt,故此输出时不在往屏幕上打印,而是输出在myfile.txt文件中
例子:
文件系统:
输入命令,从磁盘上读取文件信息,不直接去磁盘上读取文件信息,而是去找文件对应的inode(文件编号),通过inode在磁盘上找到对应的文件信息
超级块:存放文件系统本身的结构信息
inode表:存放文件属性,如:文件大小,所有者,最近修改时间等
数据区:存放文件内容