文件描述符表
当open打开文件成功后,会创建相应的结构体(数据结构),用于保存被打开文件的相关信息
对文件进行读写操作时,会用到这些信息,这个数据结构就是文件描述符表
进程表:task_struct
(1).当程序运行时成为一个进程,系统会在内存中开辟一个task_struct结构体,这个结构体又叫进程表
这个结构体成员项非常多,多达近300个
(2).task_struct专门用于存放进程在运行过程中所涉及到的所有与进程相关的信息,
其中文件描述符表就包含在了tak_struct中
(3).进程运行结束后,进程表所占用的内存空间会被释放
文件状态标志:O_RDONLY,O_WRONLY,O_RDWR等open打开时指定的,
打开时会将文件状态标志保存到文件表,在读写文件时,会先检查文件状态标志,看看有无权限,然后再去操作文件
文件长度:文件的大小
在写文件的过程中:每写一个字节的数据到文件中去,文件长度就会+1,文件长度是动态更新的
函数指针:
read,write等操作文件时,会根据底层具体情况的不同,调用不同的函数来实现读写,所以在v节点里保存了这些不同函数的函数指针,方便调用
O_APPEND时,每次写文件时,都会把文件偏移量设置为文件的长度,即把写的位置调整到了末尾,每一次写操作是,文件的内容会增加,那么自然文件的长度会被动态更新,保证每次都从文件末尾开始写数据,
在多次open同一个文件,实现共享操作,指定O_APPEND可防止数据相互覆盖
O_TRUNC:打开文件时清空文件,V节点内容长度修改为0
共享操作文件
一.同一个进程多次open同一个文件
多次打开同一文件,文件描述符不一样
#include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #define FILE_NAME "./file.txt" void print_error(char *str){ perror(str); exit(-1); } int main(){ int fd1=0; int fd2=0; fd1=open(FILE_NAME,O_RDWR|O_TRUNC|O_APPEND); if(-1 == fd1) print_error("1 open error:"); fd2=open(FILE_NAME,O_RDWR|O_TRUNC|O_APPEND); if(-1 == fd2) print_error("2 open error:"); printf("fd1=%d,fd2=%d\n",fd1,fd2 ); while(1){ write(fd1,"php\n",4); sleep(1); write(fd2,"javascript\n",11); } }
二.不同进程打开同一个文件
share1.c
#include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #define FILE_NAME "./file.txt" void print_error(char *str){ perror(str); exit(-1); } int main(){ int fd1=0; fd1=open(FILE_NAME,O_RDWR|O_TRUNC|O_APPEND); if(-1 == fd1) print_error("1 open error:"); printf("fd1=%d\n",fd1 ); while(1){ write(fd1,"php\n",4); sleep(1); } }
share2.c
#include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #define FILE_NAME "./file.txt" void print_error(char *str){ perror(str); exit(-1); } int main(){ int fd2=0; fd2=open(FILE_NAME,O_RDWR|O_TRUNC|O_APPEND); if(-1 == fd2) print_error("2 open error:"); printf("fd2=%d\n",fd2 ); while(1){ write(fd2,"js\n",3); sleep(1); } }