硬件层: inode(属性)--->文件的内容 Linux内核: struct inode{}用来描述一个文件的屋里inode的信息【链表保存】,系统识别到一个文件的存在, 就会为它创建一个struct inode,一个文件只会唯一对应一个struct inode struct file{}用来描述一个已经打开的文件: 文件状态标记(如:O_RDONLY、O_WRONLY......) 文件的偏移量/offset(类似“光标”) struct inode* 每一个打开的文件都会对应一个struct file 一个文件可以被多个不同的进程打开,一个进程也可以打开多个文件 操作文件的过程: struct file---> struct inode--->硬件上面的inode--->文件的内容 linux为了屏蔽文件操作的具体细节,为每一个进程创建一个“进程文件表项”, 保存每一个进程打开的文件的 struct file* 的数组 struct file*fds[] 0 struct file*--->struct inode...... 1 struct file*--->struct inode...... ...... linux再提供操作文件的函数接口: fd = open() 打开一个指定的文件,返回“进程文件表项”的下标, int "文件描述符":在linux应用中,用来描述一个已经打开的文件,每一个打开的文件都有有个唯一的id, 后续操作这个文件,都是通过这个id操作该文件 read(fd) write(fd) close(fd) ...... linux系统提供的这些用于操作文件的接口函数(open,read.....),我们称为“系统IO” 系统IO:操作系统提供的对文件的输入输出的接口
文件的操作步骤
NAME open, openat, creat - open and possibly create a file 打开或者创建(创建并打开)一个文件 SYNOPSIS #include <sys/types.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:打开文件的标记 O_RDONLY:只读 O_WRONLY:只写 O_RDWR:读写 以上三个标记只能选一个(文件的打开方式) O_APPEND:追加标记,打开文件后,文件的偏移量会在文件的末尾。(默认情况下,读和写的标记在文件的开头) O_CREAT:创建标记,如果不存在,则创建文件 O_EXCL:该标记一般和O_CREAT配合使用,用来测试文件是否存在 如果指定O_CREAT | O_EXCL,并且文件存在,则open会失败,并且errno设置为EEXIST,表示文件已存在 O_TRUNC:truncate 截短,清除文件内容 O_NONBLOCK:非阻塞方式打开文件 非阻塞:不等待 如果文件没有内容,read不会等待,直接返回一个错误 如果文件没有空间了,write不会阻塞,直接返回一个错误 阻塞:等待 如果文件没有内容,read会等待(直到有数据或出错) 如果文件没有空间了,write会阻塞,(直到有空间或出错) 。。。。。。 多个标记使用“|”链接(标记是使用位域实现的) O_RDWR | O_CREAT | O_TRUNC mode:指定创建的文件的权限,当第二个参数带有O_CREAT时,指定创建的文件的权限 返回值:成功打开一个文件,返回打开文件的文件描述符(>2 && int(下标)) 操作系统会自动为每一个进程打开三个文件: 标准输入文件:文件描述符 STDIN_FILENO (0) 标准输出文件:文件描述符 STDOUT_FILENO (1) 标准出错文件:文件描述符 STDERR_FILENO (2) 失败返回-1,同时errno被设置 errno是一个全局变量,是用来保存最后一个出错的错误码 头文件: #include<srrno.h> 路径:/usr/include/errno.h perror 把错误码对应的错误字符串打印出来 perro("user indi"); user indi:用户自己的提示信息 打印出来的形式:用户自己的提示信息:系统错误码的提示信息 int creat(const char *pathname, mode_t mode);
//open.c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> int main(int argc, char argv*[]) { //打开文件 int fd=open(argv[1],O_RDWR, 0666); if(-1 == fd) { printf("open %s error\n",argv[1]); //解析errno perror("open error"); return -1; } peintf("open success\n"); peintf("fd = %d\n",fd); //关闭文件 close(fd)q; retrun 0; }
NAME close - close a file descriptor SYNOPSIS #include <unistd.h> int close(int fd); close是用来关闭fd指定的文件 fd:file descriptor 文件描述符 返回值: 成功:返回0 失败:返回-1,同时errno被设置