这一节主要将系统IO的特点以及处理文件的函数。
首先介绍以下linux下的七种文件系统:
1.d 目录
2.- 普通文件
3.c 字符设备
4.b 块设备
5.l 符号链接文件
6.s 本地套接字
7.p 管道文件
文件描述符是什么意思呢?
一个txt文件读到哪了,或者它是以什么模式打开的等等信息都记录在file这个结构体中,一个file结构体只能记录一个文件的信息。file结构体是放在fd_array数组中的,用户只能看到file结构体在fd_array的排序位置(红色箭头),也就是内核空间返回给用户的文件描述符。如下图所示:
(1) open
头文件: #include<sys/type.h> #include<sys/stat.h> #include<fcntl.h>
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
pathname:路径,flags:标志
第二个函数只有创建文件的时候才要使用mode,它是指该文件的权限。
int fd = open(argv[1], O_RDWR|O_CREAT|O_EXCL,0644);
O_RDONLY:只读方式打开。
O_WRONLY:只写方式打开。
O_RDWR:表示可读可写方式打开。
O_CREAT:如果没有文件就创建一个文件。
O_EXCL:如果存在文件了就报错。
O_THUNC:如文件已经存在,则删除文件中的原有数据。
此时你会发觉fd等于3。这是为什么呢?
因为系统已经帮我们打开了三个文件0,1,2了。fd_array数组中0是代表标准输入,1是标准输出,2是标准出错。
而且如果连续打开两次该文件,两次打开模式可以不一样,那么会生成两个文件描述符。不过也不可能无限打开文件的,它是有上限的,一个进程最多只能打开1024个文件。以下是打开多个文件:
(2)close
int close(int fd);
close是释放该文件所占的资源,比如file结构体等等。