文件理解
文件=屬性+內容
打開文件:本質是進程打開文件,文件沒被打開時候再磁盤上。
操作文件:本質是進程操作文件。
在操作系統內部,一定存在大量被打開的文件,會對其進行管理,每一個被打開的文件,一定存在對應的描述文件屬性的結構體struct file。
在task_struct存在一個struct file_struct* files,files存在struct file* fd_arrary[N]
文件描述符fd本質是:文件映射關系的數組的下標。
?虛擬文件系統:推薦深入理解LinuxVFS與文件系統抽象-CSDN博客
文件操作
open
#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: 打開文件時,可以傳入多個參數選項,用下面的一個或者多個常量進行“或”運算,構成flags。
參數:O_RDONLY: 只讀打開O_WRONLY: 只寫打開O_RDWR : 讀,寫打開這三個常量,必須指定一個且只能指定一個O_CREAT : 若文件不存在,則創建它。需要使用mode選項,來指明新文件的訪問權限O_APPEND: 追加寫mode_t理解:直接 man 手冊,比什么都清楚。O_TRUNC:文件存在就清空
返回值:成功:新打開的文件描述符失敗:-1
創建成功,返回值大于等于3,是文件描述符
0:標準輸入
1:標準輸出
2:標準錯誤
因此向顯示器打印也可以用write。
過程:
1.創建file
2.開辟文件緩沖區空間,加載文件數據(延后)
3.查看進程的文件描述符
4.file地址填入對應下標
5.返回下標
write
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
無論讀寫。都必須在合適的時候,讓操作系統吧文件的內容讀到緩沖區。
在C語言中,FILE是一個結構體,一定封裝描述符fd。
文件操作還是建議用語言提供的文件方法,因為平臺不同,系統調用接口不同。